/// <summary> /// Start Voice Capturing /// </summary> /// <returns></returns> public bool Start() { if (!_Initialized) { return(false); } Stop(); foreach (IntPtr handle in _RecHandle) { int waitcount = 0; while (waitcount < 5 && PortAudioSharp.PortAudio.Pa_IsStreamStopped(handle) == PortAudioSharp.PortAudio.PaError.paStreamIsNotStopped) { Thread.Sleep(1); waitcount++; } } foreach (CBuffer buffer in _Buffer) { buffer.Reset(); } for (int i = 0; i < _RecHandle.Length; i++) { _RecHandle[i] = IntPtr.Zero; } for (int dev = 0; dev < _Devices.Count; dev++) { bool usingDevice = false; for (int ch = 0; ch < _Devices[dev].Channels; ++ch) { if (_Devices[dev].PlayerChannel[ch] > 0) { usingDevice = true; } } if (usingDevice) { PortAudioSharp.PortAudio.PaStreamParameters?inputParams = new PortAudioSharp.PortAudio.PaStreamParameters { channelCount = _Devices[dev].Channels, device = _Devices[dev].ID, sampleFormat = PortAudioSharp.PortAudio.PaSampleFormat.paInt16, suggestedLatency = PortAudioSharp.PortAudio.Pa_GetDeviceInfo(_Devices[dev].ID).defaultLowInputLatency, hostApiSpecificStreamInfo = IntPtr.Zero }; if (!_PaHandle.OpenInputStream( out _RecHandle[dev], ref inputParams, 44100, 882, PortAudioSharp.PortAudio.PaStreamFlags.paNoFlag, _MyRecProc, new IntPtr(dev))) { return(false); } if (_PaHandle.CheckError("Start Stream (rec)", PortAudioSharp.PortAudio.Pa_StartStream(_RecHandle[dev]))) { return(false); } } } return(true); }
public override bool Open(bool prescan) { Debug.Assert(!_FileOpened); if (_FileOpened) { return(false); } if (!File.Exists(_Medium)) { Dispose(); return(false); } try { _PaHandle = new CPortAudioHandle(); int hostApi = _PaHandle.GetHostApi(); _ApiInfo = PortAudioSharp.PortAudio.Pa_GetHostApiInfo(hostApi); _OutputDeviceInfo = PortAudioSharp.PortAudio.Pa_GetDeviceInfo(_ApiInfo.defaultOutputDevice); if (_OutputDeviceInfo.defaultLowOutputLatency < 0.1) { _OutputDeviceInfo.defaultLowOutputLatency = 0.1; } _PaStreamCallback = _ProcessNewData; } catch (Exception) { Dispose(); CLog.Error("Error Init PortAudio Playback"); return(false); } _Decoder = new CAudioDecoderFFmpeg(); if (!_Decoder.Open(_Medium)) { Dispose(); CLog.Error("Error opening audio file: " + _Medium); return(false); } SFormatInfo format = _Decoder.GetFormatInfo(); if (format.SamplesPerSecond == 0) { Dispose(); CLog.Error("Error Init PortAudio Playback (samples=0)"); return(false); } Length = _Decoder.GetLength(); _ByteCount = 2 * format.ChannelCount; _BytesPerSecond = format.SamplesPerSecond * _ByteCount; _SyncTimer.Pause(); _SyncTimer.Time = 0f; PortAudioSharp.PortAudio.PaStreamParameters?outputParams = new PortAudioSharp.PortAudio.PaStreamParameters { channelCount = format.ChannelCount, device = _ApiInfo.defaultOutputDevice, sampleFormat = PortAudioSharp.PortAudio.PaSampleFormat.paInt16, suggestedLatency = _OutputDeviceInfo.defaultLowOutputLatency, hostApiSpecificStreamInfo = IntPtr.Zero }; if (!_PaHandle.OpenOutputStream( out _Stream, ref outputParams, format.SamplesPerSecond, (uint)CConfig.Config.Sound.AudioBufferSize / 2, PortAudioSharp.PortAudio.PaStreamFlags.paNoFlag, _PaStreamCallback, IntPtr.Zero) || _Stream == IntPtr.Zero) { Dispose(); return(false); } _Latency = CConfig.Config.Sound.AudioLatency / 1000f + (float)PortAudioSharp.PortAudio.Pa_GetStreamInfo(_Stream).outputLatency; //From now on closing the driver and the decoder is handled by the thread ONLY! _Paused = true; _FileOpened = true; _Data = new CRingBuffer(_Bufsize); _NoMoreData = false; _DecoderThread = new Thread(_Execute) { Priority = ThreadPriority.Normal, Name = Path.GetFileName(_Medium) }; _DecoderThread.Start(); return(true); }