Fix managed iOS native media linking
This commit is contained in:
@@ -8,7 +8,6 @@
|
||||
<RestorePackagesWithLockFile>true</RestorePackagesWithLockFile>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(VoiceCatIosStatic)' == 'true'">
|
||||
<DefineConstants>$(DefineConstants);VOICECAT_IOS_STATIC</DefineConstants>
|
||||
<RuntimeIdentifiers>ios-arm64;iossimulator-arm64</RuntimeIdentifiers>
|
||||
<NuGetLockFilePath>packages.ios.lock.json</NuGetLockFilePath>
|
||||
</PropertyGroup>
|
||||
|
||||
@@ -1,14 +1,19 @@
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Reflection;
|
||||
|
||||
namespace VoiceCat.Codec;
|
||||
|
||||
internal static unsafe partial class NativeMethods
|
||||
{
|
||||
#if VOICECAT_IOS_STATIC
|
||||
private const string Library = "__Internal";
|
||||
#else
|
||||
static NativeMethods()
|
||||
{
|
||||
if (OperatingSystem.IsIOS()) NativeLibrary.SetDllImportResolver(typeof(NativeMethods).Assembly, ResolveIosStaticLibrary);
|
||||
}
|
||||
|
||||
private static nint ResolveIosStaticLibrary(string libraryName, Assembly assembly, DllImportSearchPath? searchPath) =>
|
||||
libraryName == "voicecat_media" ? NativeLibrary.GetMainProgramHandle() : 0;
|
||||
|
||||
private const string Library = "voicecat_media";
|
||||
#endif
|
||||
[LibraryImport(Library, EntryPoint = "vcm_opus_version")]
|
||||
internal static partial nint Version();
|
||||
[LibraryImport(Library, EntryPoint = "vcm_opus_error")]
|
||||
|
||||
@@ -43,6 +43,7 @@ public sealed partial class VoiceCatClient : IAsyncDisposable
|
||||
|
||||
public event Action<ClientConnectionState>? ConnectionStateChanged;
|
||||
public ClientConnectionState State { get { lock (stateGate) return state; } }
|
||||
public Exception? ConnectionFailure { get; private set; }
|
||||
public Task Completion => reader;
|
||||
public AuthResult? Authentication { get { lock (stateGate) return authentication?.Clone(); } }
|
||||
public ServerHello? ServerHello { get { lock (stateGate) return hello?.Clone(); } }
|
||||
@@ -72,6 +73,7 @@ public sealed partial class VoiceCatClient : IAsyncDisposable
|
||||
ObjectDisposedException.ThrowIf(disposed.IsCancellationRequested, this);
|
||||
if (control is not null) throw new InvalidOperationException("Disconnect before reconnecting.");
|
||||
started = true;
|
||||
ConnectionFailure = null;
|
||||
connectionLifetime = CancellationTokenSource.CreateLinkedTokenSource(disposed.Token);
|
||||
using var connecting = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken, connectionLifetime.Token);
|
||||
CancellationToken token = connecting.Token;
|
||||
@@ -201,7 +203,7 @@ public sealed partial class VoiceCatClient : IAsyncDisposable
|
||||
if (message.Disconnect is not null) { connection.CompleteWrites(); break; }
|
||||
}
|
||||
}
|
||||
catch (Exception exception) when (exception is IOException or OperationCanceledException or SocketException or ObjectDisposedException) { failure = exception; }
|
||||
catch (Exception exception) { failure = exception; ConnectionFailure = exception; }
|
||||
finally
|
||||
{
|
||||
connectionLifetime?.Cancel();
|
||||
|
||||
@@ -1,21 +1,26 @@
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Reflection;
|
||||
using Microsoft.Win32.SafeHandles;
|
||||
|
||||
namespace VoiceCat.Dsp;
|
||||
|
||||
public sealed unsafe partial class RnnoiseProcessor : IDisposable
|
||||
{
|
||||
#if VOICECAT_IOS_STATIC
|
||||
private const string NativeLibrary = "__Internal";
|
||||
#else
|
||||
private const string NativeLibrary = "voicecat_media";
|
||||
#endif
|
||||
public const int SampleRate = 48000;
|
||||
public const int FrameSamples = 480;
|
||||
private readonly RnnoiseHandle handle;
|
||||
private readonly float[] input = new float[FrameSamples];
|
||||
private readonly float[] output = new float[FrameSamples];
|
||||
|
||||
static RnnoiseProcessor()
|
||||
{
|
||||
if (OperatingSystem.IsIOS()) System.Runtime.InteropServices.NativeLibrary.SetDllImportResolver(typeof(RnnoiseProcessor).Assembly, ResolveIosStaticLibrary);
|
||||
}
|
||||
|
||||
private static nint ResolveIosStaticLibrary(string libraryName, Assembly assembly, DllImportSearchPath? searchPath) =>
|
||||
libraryName == NativeLibrary ? System.Runtime.InteropServices.NativeLibrary.GetMainProgramHandle() : 0;
|
||||
|
||||
public RnnoiseProcessor()
|
||||
{
|
||||
handle = new(Create());
|
||||
|
||||
Reference in New Issue
Block a user