diff options
author | Jeremy White <jwhite@codeweavers.com> | 2013-11-30 09:19:21 -0600 |
---|---|---|
committer | Christophe Fergeau <cfergeau@redhat.com> | 2014-01-02 12:36:59 +0100 |
commit | ce9b714137a767b81f2d3c40b5f3ce0d5cf70fc8 (patch) | |
tree | d0d0c87004994d5d037fb63a7c1d588bafe11226 /client/playback_channel.cpp | |
parent | 4c7c0ef3a70001b1bc9011ef824d3c6fcccd9ca0 (diff) | |
download | spice-ce9b714137a767b81f2d3c40b5f3ce0d5cf70fc8.tar.gz spice-ce9b714137a767b81f2d3c40b5f3ce0d5cf70fc8.tar.xz spice-ce9b714137a767b81f2d3c40b5f3ce0d5cf70fc8.zip |
Add support for the Opus codec
Signed-off-by: Jeremy White <jwhite@codeweavers.com>
Diffstat (limited to 'client/playback_channel.cpp')
-rw-r--r-- | client/playback_channel.cpp | 23 |
1 files changed, 13 insertions, 10 deletions
diff --git a/client/playback_channel.cpp b/client/playback_channel.cpp index 173c94a6..9f8c334c 100644 --- a/client/playback_channel.cpp +++ b/client/playback_channel.cpp @@ -168,8 +168,10 @@ PlaybackChannel::PlaybackChannel(RedClient& client, uint32_t id) handler->set_handler(SPICE_MSG_PLAYBACK_MODE, &PlaybackChannel::handle_mode); - if (snd_codec_is_capable(SPICE_AUDIO_DATA_MODE_CELT_0_5_1)) + if (snd_codec_is_capable(SPICE_AUDIO_DATA_MODE_CELT_0_5_1, SND_CODEC_ANY_FREQUENCY)) set_capability(SPICE_PLAYBACK_CAP_CELT_0_5_1); + if (snd_codec_is_capable(SPICE_AUDIO_DATA_MODE_OPUS, SND_CODEC_ANY_FREQUENCY)) + set_capability(SPICE_PLAYBACK_CAP_OPUS); } void PlaybackChannel::clear() @@ -206,7 +208,7 @@ void PlaybackChannel::set_data_handler() if (_mode == SPICE_AUDIO_DATA_MODE_RAW) { handler->set_handler(SPICE_MSG_PLAYBACK_DATA, &PlaybackChannel::handle_raw_data); - } else if (snd_codec_is_capable(_mode)) { + } else if (snd_codec_is_capable(_mode, SND_CODEC_ANY_FREQUENCY)) { handler->set_handler(SPICE_MSG_PLAYBACK_DATA, &PlaybackChannel::handle_compressed_data); } else { THROW("invalid mode"); @@ -218,7 +220,7 @@ void PlaybackChannel::handle_mode(RedPeer::InMessage* message) { SpiceMsgPlaybackMode* playback_mode = (SpiceMsgPlaybackMode*)message->data(); if (playback_mode->mode != SPICE_AUDIO_DATA_MODE_RAW - && !snd_codec_is_capable(playback_mode->mode) ) { + && !snd_codec_is_capable(playback_mode->mode, SND_CODEC_ANY_FREQUENCY) ) { THROW("invalid mode"); } @@ -266,9 +268,16 @@ void PlaybackChannel::handle_start(RedPeer::InMessage* message) } int bits_per_sample = 16; int frame_size = SND_CODEC_MAX_FRAME_SIZE; + + if (_mode != SPICE_AUDIO_DATA_MODE_RAW) { + if (snd_codec_create(&_codec, _mode, start->frequency, SND_CODEC_DECODE) != SND_CODEC_OK) + THROW("create decoder"); + frame_size = snd_codec_frame_size(_codec); + } + try { _wave_player = Platform::create_player(start->frequency, bits_per_sample, - start->channels); + start->channels, frame_size); } catch (...) { LOG_WARN("create player failed"); //todo: support disconnecting single channel @@ -276,12 +285,6 @@ void PlaybackChannel::handle_start(RedPeer::InMessage* message) return; } - if (_mode != SPICE_AUDIO_DATA_MODE_RAW) { - if (snd_codec_create(&_codec, _mode, start->frequency, SND_CODEC_DECODE) != SND_CODEC_OK) - THROW("create decoder"); - frame_size = snd_codec_frame_size(_codec); - } - _frame_bytes = frame_size * start->channels * bits_per_sample / 8; } _playing = true; |