Esempio n. 1
0
        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();
        }
Esempio n. 2
0
        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);
            }
        }
Esempio n. 3
0
        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);
            }
        }
Esempio n. 4
0
        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;
        }
Esempio n. 5
0
        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;
        }