summaryrefslogtreecommitdiffstats
path: root/Examples/MicrophoneCS/CaptureThread.cs
blob: b76a929fe8c2d78516e6f3239c65d6c257a82ce0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
using System.Runtime.ExceptionServices;
using Whisper;

namespace MicrophoneCS
{
	sealed class CaptureThread: CaptureCallbacks
	{
		public CaptureThread( CommandLineArgs args, Context context, iAudioCapture source )
		{
			callbacks = new TranscribeCallbacks( args );
			this.context = context;
			this.source = source;

			thread = new Thread( threadMain ) { Name = "Capture Thread" };
			Console.WriteLine( "Press any key to quit" );
			thread.Start();
		}

		static void readKeyCallback( object? state )
		{
			CaptureThread ct = ( state as CaptureThread ) ?? throw new ApplicationException();
			Console.ReadKey();
			ct.shouldQuit = true;
		}

		public void join()
		{
			ThreadPool.QueueUserWorkItem( readKeyCallback, this );
			thread.Join();
			edi?.Throw();
		}

		volatile bool shouldQuit = false;

		protected override bool shouldCancel( Context sender ) =>
			shouldQuit;

		protected override void captureStatusChanged( Context sender, eCaptureStatus status )
		{
			Console.WriteLine( $"CaptureStatusChanged: {status}" );
		}

		readonly TranscribeCallbacks callbacks;
		readonly Thread thread;
		readonly Context context;
		readonly iAudioCapture source;
		ExceptionDispatchInfo? edi = null;

		void threadMain()
		{
			try
			{
				context.runCapture( source, callbacks, this );
			}
			catch( Exception ex )
			{
				edi = ExceptionDispatchInfo.Capture( ex );
			}
		}
	}
}