private void ReceiveAudio(AudioPacket packet, DhtClient client) { if (!RemoteVoices.ContainsKey(client.UserID)) { RemoteVoices[client.UserID] = new RemoteVoice(); } RemoteVoice user = RemoteVoices[client.UserID]; if (!user.Streams.ContainsKey(client.RoutingID)) { user.Streams[client.RoutingID] = new PlayAudio(this, packet.FrameSize, user); Players.SafeAdd(user.Streams[client.RoutingID]); } PlayAudio stream = user.Streams[client.RoutingID]; // reset if user changed quality setting if (stream.FrameSize != packet.FrameSize) { stream.Dispose(); user.Streams[client.RoutingID] = new PlayAudio(this, packet.FrameSize, user); Players.SafeAdd(user.Streams[client.RoutingID]); stream = user.Streams[client.RoutingID]; } StartAudioThread(false); stream.Receive_AudioData(packet.Audio); UpdateVolume(); }
public PlayAudio(VoiceService voices, int frameSize, RemoteVoice user) { Voices = voices; User = user; CallbackHandler = new WinMM.WaveDelegate(WaveCallback); FrameSize = frameSize; int sampleRate = 0; // if 20ms, at high quality (16khz) is 320 samples at 2 bytes each if (FrameSize == 320) { sampleRate = 16000; BufferSize = 320 * 2 * 2; // 2 bytes each frame, 2 channels SpeexMode = Speex.SPEEX_MODEID_WB; } else if (FrameSize == 160) { sampleRate = 8000; BufferSize = 160 * 2 * 2; SpeexMode = Speex.SPEEX_MODEID_NB; } else { Dispose(); return; } try { // init speex Speex.speex_bits_init(ref DecodeBits); IntPtr modePtr = Speex.speex_lib_get_mode(SpeexMode); SpeexDecoder = Speex.speex_decoder_init(modePtr); int tmp = 1; Speex.speex_decoder_ctl(SpeexDecoder, Speex.SPEEX_SET_ENH, ref tmp); // init wave Format = new WinMM.WaveFormat(sampleRate, 16, 2); WinMM.ErrorCheck(WinMM.waveOutOpen(out WaveHandle, Voices.PlaybackDevice, Format, CallbackHandler, 0, WinMM.CALLBACK_FUNCTION)); for (int i = 0; i < BufferCount; i++) { Buffers[i] = new PlayBuffer(i, WaveHandle, BufferSize); } } catch (Exception ex) { Dispose(); Voices.Core.Network.UpdateLog("Voice", "Error starting playing: " + ex.Message); } }
public PlayAudio(VoiceService voices, int frameSize, RemoteVoice user) { Voices = voices; User = user; CallbackHandler = new WinMM.WaveDelegate(WaveCallback); FrameSize = frameSize; int sampleRate = 0; // if 20ms, at high quality (16khz) is 320 samples at 2 bytes each if (FrameSize == 320) { sampleRate = 16000; BufferSize = 320 * 2 * 2; // 2 bytes each frame, 2 channels SpeexMode = Speex.SPEEX_MODEID_WB; } else if(FrameSize == 160) { sampleRate = 8000; BufferSize = 160 * 2 * 2; SpeexMode = Speex.SPEEX_MODEID_NB; } else { Dispose(); return; } try { // init speex Speex.speex_bits_init(ref DecodeBits); IntPtr modePtr = Speex.speex_lib_get_mode(SpeexMode); SpeexDecoder = Speex.speex_decoder_init(modePtr); int tmp = 1; Speex.speex_decoder_ctl(SpeexDecoder, Speex.SPEEX_SET_ENH, ref tmp); // init wave Format = new WinMM.WaveFormat(sampleRate, 16, 2); WinMM.ErrorCheck(WinMM.waveOutOpen(out WaveHandle, Voices.PlaybackDevice, Format, CallbackHandler, 0, WinMM.CALLBACK_FUNCTION)); for (int i = 0; i < BufferCount; i++) Buffers[i] = new PlayBuffer(i, WaveHandle, BufferSize); } catch (Exception ex) { Dispose(); Voices.Core.Network.UpdateLog("Voice", "Error starting playing: " + ex.Message); } }
public void ListenTo(int window, ulong user, AudioDirection direction) { if (Core.InvokeRequired) { Core.RunInCoreAsync(() => ListenTo(window, user, direction)); return; } // incoming voice from user will be outputted to speaker, and window notified if (!RemoteVoices.ContainsKey(user)) { RemoteVoices[user] = new RemoteVoice(); } RemoteVoice remote = RemoteVoices[user]; remote.ListeningTo[window] = direction; }
public void ListenTo(int window, ulong user, AudioDirection direction) { if (Core.InvokeRequired) { Core.RunInCoreAsync(() => ListenTo(window, user, direction)); return; } // incoming voice from user will be outputted to speaker, and window notified if (!RemoteVoices.ContainsKey(user)) RemoteVoices[user] = new RemoteVoice(); RemoteVoice remote = RemoteVoices[user]; remote.ListeningTo[window] = direction; }