summaryrefslogtreecommitdiffstats
path: root/client/playback_channel.cpp
diff options
context:
space:
mode:
authorJeremy White <jwhite@codeweavers.com>2013-11-30 09:19:21 -0600
committerChristophe Fergeau <cfergeau@redhat.com>2014-01-02 12:36:59 +0100
commitce9b714137a767b81f2d3c40b5f3ce0d5cf70fc8 (patch)
treed0d0c87004994d5d037fb63a7c1d588bafe11226 /client/playback_channel.cpp
parent4c7c0ef3a70001b1bc9011ef824d3c6fcccd9ca0 (diff)
downloadspice-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.cpp23
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;