using System.Runtime.InteropServices; using Whisper.Internal; namespace Whisper { /// Extension methods of these COM interfaces public static class ExtensionMethods { /// Create a context to transcribe audio with this model public static Context createContext( this iModel model ) { iContext ctx = model.createContextInternal(); return new Context( ctx ); } /// Convert language into a short ID string, like "en" public static string getCode( this eLanguage lang ) { unsafe { sbyte* ptr = stackalloc sbyte[ 5 ]; *(uint*)ptr = (uint)lang; ptr[ 4 ] = 0; return new string( ptr ); } } /// Resolve integer token ID into string. /// If the token ID was not found in the model, the method returns null without raising exceptions. public static string? stringFromToken( this iModel model, int idToken ) => Marshal.PtrToStringUTF8( model.stringFromTokenInternal( idToken ) ); /// List capture devices public static CaptureDeviceId[]? listCaptureDevices( this iMediaFoundation mf ) { List? list = null; pfnFoundCaptureDevices pfn = delegate ( int len, sCaptureDevice[]? arr, IntPtr pv ) { try { if( len == 0 || arr == null ) return 1; list = new List( len ); foreach( var i in arr ) list.Add( new CaptureDeviceId( i ) ); return 0; } catch( Exception ex ) { NativeLogger.captureException( ex ); return ex.HResult; } }; mf.listCaptureDevices( pfn, IntPtr.Zero ); return list?.ToArray(); } /// Open audio capture device public static iAudioCapture openCaptureDevice( this iMediaFoundation mf, in CaptureDeviceId id, in sCaptureParams? cp = null ) { sCaptureParams captureParams = cp ?? new sCaptureParams(); return mf.openCaptureDevice( id.endpoint, ref captureParams ); } } }