diff options
author | Jeremy White <jwhite@codeweavers.com> | 2013-11-30 09:14:44 -0600 |
---|---|---|
committer | Christophe Fergeau <cfergeau@redhat.com> | 2014-01-02 12:34:34 +0100 |
commit | 4c7c0ef3a70001b1bc9011ef824d3c6fcccd9ca0 (patch) | |
tree | 22ff63f9ed6e7bc671244ece6cba72da61851740 /client/playback_channel.cpp | |
parent | 4fc9ba5f27dd4c04441d38c893ee962da01baf80 (diff) | |
download | spice-4c7c0ef3a70001b1bc9011ef824d3c6fcccd9ca0.tar.gz spice-4c7c0ef3a70001b1bc9011ef824d3c6fcccd9ca0.tar.xz spice-4c7c0ef3a70001b1bc9011ef824d3c6fcccd9ca0.zip |
Revise the spice client and server to use the new snd_codec functions in spice-common.
This makes celt optional, and paves the way to readily add additional codecs.
Signed-off-by: Jeremy White <jwhite@codeweavers.com>
Diffstat (limited to 'client/playback_channel.cpp')
-rw-r--r-- | client/playback_channel.cpp | 59 |
1 files changed, 25 insertions, 34 deletions
diff --git a/client/playback_channel.cpp b/client/playback_channel.cpp index 802a4d3b..173c94a6 100644 --- a/client/playback_channel.cpp +++ b/client/playback_channel.cpp @@ -151,8 +151,7 @@ PlaybackChannel::PlaybackChannel(RedClient& client, uint32_t id) Platform::PRIORITY_HIGH) , _wave_player (NULL) , _mode (SPICE_AUDIO_DATA_MODE_INVALID) - , _celt_mode (NULL) - , _celt_decoder (NULL) + , _codec(NULL) , _playing (false) { #ifdef WAVE_CAPTURE @@ -169,7 +168,8 @@ PlaybackChannel::PlaybackChannel(RedClient& client, uint32_t id) handler->set_handler(SPICE_MSG_PLAYBACK_MODE, &PlaybackChannel::handle_mode); - set_capability(SPICE_PLAYBACK_CAP_CELT_0_5_1); + if (snd_codec_is_capable(SPICE_AUDIO_DATA_MODE_CELT_0_5_1)) + set_capability(SPICE_PLAYBACK_CAP_CELT_0_5_1); } void PlaybackChannel::clear() @@ -182,15 +182,7 @@ void PlaybackChannel::clear() } _mode = SPICE_AUDIO_DATA_MODE_INVALID; - if (_celt_decoder) { - celt051_decoder_destroy(_celt_decoder); - _celt_decoder = NULL; - } - - if (_celt_mode) { - celt051_mode_destroy(_celt_mode); - _celt_mode = NULL; - } + snd_codec_destroy(&_codec); } void PlaybackChannel::on_disconnect() @@ -214,22 +206,23 @@ 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 (_mode == SPICE_AUDIO_DATA_MODE_CELT_0_5_1) { - handler->set_handler(SPICE_MSG_PLAYBACK_DATA, &PlaybackChannel::handle_celt_data); + } else if (snd_codec_is_capable(_mode)) { + handler->set_handler(SPICE_MSG_PLAYBACK_DATA, &PlaybackChannel::handle_compressed_data); } else { THROW("invalid mode"); } + } void PlaybackChannel::handle_mode(RedPeer::InMessage* message) { - SpiceMsgPlaybackMode* playbacke_mode = (SpiceMsgPlaybackMode*)message->data(); - if (playbacke_mode->mode != SPICE_AUDIO_DATA_MODE_RAW && - playbacke_mode->mode != SPICE_AUDIO_DATA_MODE_CELT_0_5_1) { + SpiceMsgPlaybackMode* playback_mode = (SpiceMsgPlaybackMode*)message->data(); + if (playback_mode->mode != SPICE_AUDIO_DATA_MODE_RAW + && !snd_codec_is_capable(playback_mode->mode) ) { THROW("invalid mode"); } - _mode = playbacke_mode->mode; + _mode = playback_mode->mode; if (_playing) { set_data_handler(); return; @@ -265,15 +258,14 @@ void PlaybackChannel::handle_start(RedPeer::InMessage* message) start_wave(); #endif if (!_wave_player) { - // for now support only one setting - int celt_mode_err; - if (start->format != SPICE_AUDIO_FMT_S16) { THROW("unexpected format"); } + if (start->channels != 2) { + THROW("unexpected number of channels"); + } int bits_per_sample = 16; - int frame_size = 256; - _frame_bytes = frame_size * start->channels * bits_per_sample / 8; + int frame_size = SND_CODEC_MAX_FRAME_SIZE; try { _wave_player = Platform::create_player(start->frequency, bits_per_sample, start->channels); @@ -284,14 +276,13 @@ void PlaybackChannel::handle_start(RedPeer::InMessage* message) return; } - if (!(_celt_mode = celt051_mode_create(start->frequency, start->channels, - frame_size, &celt_mode_err))) { - THROW("create celt mode failed %d", celt_mode_err); + 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); } - if (!(_celt_decoder = celt051_decoder_create(_celt_mode))) { - THROW("create celt decoder"); - } + _frame_bytes = frame_size * start->channels * bits_per_sample / 8; } _playing = true; _frame_count = 0; @@ -333,16 +324,16 @@ void PlaybackChannel::handle_raw_data(RedPeer::InMessage* message) _wave_player->write(data); } -void PlaybackChannel::handle_celt_data(RedPeer::InMessage* message) +void PlaybackChannel::handle_compressed_data(RedPeer::InMessage* message) { SpiceMsgPlaybackPacket* packet = (SpiceMsgPlaybackPacket*)message->data(); uint8_t* data = packet->data; uint32_t size = packet->data_size; - celt_int16_t pcm[256 * 2]; + int pcm_size = _frame_bytes; + uint8_t pcm[_frame_bytes]; - if (celt051_decode(_celt_decoder, data, size, pcm) != CELT_OK) { - THROW("celt decode failed"); - } + if (snd_codec_decode(_codec, data, size, pcm, &pcm_size) != SND_CODEC_OK) + THROW("decode failed"); #ifdef WAVE_CAPTURE put_wave_data(pcm, _frame_bytes); return; |