[Spice-devel] [PATCH] make celt to be optional

Alon Levy alevy at redhat.com
Mon Jun 4 05:28:00 PDT 2012


On Mon, Jun 04, 2012 at 11:33:22AM +0200, Christophe Fergeau wrote:
> Makes sense to me though I've only looked quickly through it. Since it
> works for you, I'm in favour of committing it if noone disagrees.

I agree. Would you do a review and ack?

> 
> Christophe
> 
> On Sat, Jun 02, 2012 at 03:46:55PM +0400, Michael Tokarev wrote:
> > With this patch applied, celt051 library isn't required
> > anymore.  It is still required by default, but there's
> > a new configure option, --disable-celt051, which makes
> > the configure code to omit checking/finding the celt
> > library and makes resulting spice library to not use
> > celt codec at all.
> > 
> > The changes in the code - there are relatively many -
> > are located in 3 source files (see diffstat):
> > 
> >  client/playback_channel.cpp
> >  client/record_channel.cpp
> >  server/snd_worker.c
> > 
> > and are local/private to the library (client and server),
> > so no external ABI/API is done.
> > 
> > I found and marked hopefully all places where celt
> > codec is being touched/referenced.  The patch may
> > help future development too, indicating all places
> > where codec-specific code is used (just grep source
> > for HAVE_CELT051 to see these).
> > 
> > I plan to use this patch in the upcoming Debian
> > release, codename wheezy, to get rid of celt
> > codec library there, since we decided celt051 is
> > not going to be included, but it is obviously not
> > a good idea to drop spice entirely.
> > 
> > I did some interoperability tests and the thing
> > appears to work -- unpatched client to patched
> > server, patched client to unpatched server and
> > patched client to patched server.  I didn't check
> > old clients and servers, however.  In all cases,
> > raw audio stream is being choosen and used.  But
> > since I don't really know how spice works internally,
> > maybe I didn't perform correct testing.
> > 
> > Please consider applying.
> > 
> > Signed-off-By: Michael Tokarev <mjt at tls.msk.ru>
> > Cc: Ron Lee <ron at debian.org>
> > Cc: Liang Guo <bluestonechina at gmail.com>
> > ---
> >  client/audio_channels.h     |    8 +++++
> >  client/playback_channel.cpp |   25 ++++++++++---
> >  client/record_channel.cpp   |   21 +++++++++--
> >  configure.ac                |   16 ++++++---
> >  server/snd_worker.c         |   82 ++++++++++++++++++++++++++++++++++---------
> >  5 files changed, 122 insertions(+), 30 deletions(-)
> > 
> > diff --git a/client/audio_channels.h b/client/audio_channels.h
> > index d38a79e..8f8a186 100644
> > --- a/client/audio_channels.h
> > +++ b/client/audio_channels.h
> > @@ -18,7 +18,9 @@
> >  #ifndef _H_AUDIO_CHANNELS
> >  #define _H_AUDIO_CHANNELS
> >  
> > +#if HAVE_CELT051
> >  #include <celt051/celt.h>
> > +#endif
> >  
> >  #include "red_channel.h"
> >  #include "debug.h"
> > @@ -45,7 +47,9 @@ private:
> >      void handle_start(RedPeer::InMessage* message);
> >      void handle_stop(RedPeer::InMessage* message);
> >      void handle_raw_data(RedPeer::InMessage* message);
> > +#if HAVE_CELT051
> >      void handle_celt_data(RedPeer::InMessage* message);
> > +#endif
> >      void null_handler(RedPeer::InMessage* message);
> >      void disable();
> >  
> > @@ -57,8 +61,10 @@ private:
> >      WavePlaybackAbstract* _wave_player;
> >      uint32_t _mode;
> >      uint32_t _frame_bytes;
> > +#if HAVE_CELT051
> >      CELTMode *_celt_mode;
> >      CELTDecoder *_celt_decoder;
> > +#endif
> >      bool _playing;
> >      uint32_t _frame_count;
> >  };
> > @@ -96,8 +102,10 @@ private:
> >      Mutex _messages_lock;
> >      std::list<RecordSamplesMessage *> _messages;
> >      int _mode;
> > +#if HAVE_CELT051
> >      CELTMode *_celt_mode;
> >      CELTEncoder *_celt_encoder;
> > +#endif
> >      uint32_t _frame_bytes;
> >  
> >      static int data_mode;
> > diff --git a/client/playback_channel.cpp b/client/playback_channel.cpp
> > index 802a4d3..caf6424 100644
> > --- a/client/playback_channel.cpp
> > +++ b/client/playback_channel.cpp
> > @@ -151,8 +151,10 @@ PlaybackChannel::PlaybackChannel(RedClient& client, uint32_t id)
> >                   Platform::PRIORITY_HIGH)
> >      , _wave_player (NULL)
> >      , _mode (SPICE_AUDIO_DATA_MODE_INVALID)
> > +#if HAVE_CELT051
> >      , _celt_mode (NULL)
> >      , _celt_decoder (NULL)
> > +#endif
> >      , _playing (false)
> >  {
> >  #ifdef WAVE_CAPTURE
> > @@ -169,7 +171,9 @@ PlaybackChannel::PlaybackChannel(RedClient& client, uint32_t id)
> >  
> >      handler->set_handler(SPICE_MSG_PLAYBACK_MODE, &PlaybackChannel::handle_mode);
> >  
> > +#if HAVE_CELT051
> >      set_capability(SPICE_PLAYBACK_CAP_CELT_0_5_1);
> > +#endif
> >  }
> >  
> >  void PlaybackChannel::clear()
> > @@ -182,6 +186,7 @@ void PlaybackChannel::clear()
> >      }
> >      _mode = SPICE_AUDIO_DATA_MODE_INVALID;
> >  
> > +#if HAVE_CELT051
> >      if (_celt_decoder) {
> >          celt051_decoder_destroy(_celt_decoder);
> >          _celt_decoder = NULL;
> > @@ -191,6 +196,7 @@ void PlaybackChannel::clear()
> >          celt051_mode_destroy(_celt_mode);
> >          _celt_mode = NULL;
> >      }
> > +#endif
> >  }
> >  
> >  void PlaybackChannel::on_disconnect()
> > @@ -214,8 +220,10 @@ void PlaybackChannel::set_data_handler()
> >  
> >      if (_mode == SPICE_AUDIO_DATA_MODE_RAW) {
> >          handler->set_handler(SPICE_MSG_PLAYBACK_DATA, &PlaybackChannel::handle_raw_data);
> > +#if HAVE_CELT051
> >      } else if (_mode == SPICE_AUDIO_DATA_MODE_CELT_0_5_1) {
> >          handler->set_handler(SPICE_MSG_PLAYBACK_DATA, &PlaybackChannel::handle_celt_data);
> > +#endif
> >      } else {
> >          THROW("invalid mode");
> >      }
> > @@ -224,8 +232,11 @@ void PlaybackChannel::set_data_handler()
> >  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) {
> > +    if (playbacke_mode->mode != SPICE_AUDIO_DATA_MODE_RAW
> > +#if HAVE_CELT051
> > +        && playbacke_mode->mode != SPICE_AUDIO_DATA_MODE_CELT_0_5_1
> > +#endif
> > +       ) {
> >          THROW("invalid mode");
> >      }
> >  
> > @@ -265,9 +276,6 @@ 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");
> >          }
> > @@ -284,6 +292,10 @@ void PlaybackChannel::handle_start(RedPeer::InMessage* message)
> >              return;
> >          }
> >  
> > +#if HAVE_CELT051
> > +        // for now support only one setting
> > +        int celt_mode_err;
> > +
> >          if (!(_celt_mode = celt051_mode_create(start->frequency, start->channels,
> >                                                 frame_size, &celt_mode_err))) {
> >              THROW("create celt mode failed %d", celt_mode_err);
> > @@ -292,6 +304,7 @@ void PlaybackChannel::handle_start(RedPeer::InMessage* message)
> >          if (!(_celt_decoder = celt051_decoder_create(_celt_mode))) {
> >              THROW("create celt decoder");
> >          }
> > +#endif
> >      }
> >      _playing = true;
> >      _frame_count = 0;
> > @@ -333,6 +346,7 @@ void PlaybackChannel::handle_raw_data(RedPeer::InMessage* message)
> >      _wave_player->write(data);
> >  }
> >  
> > +#if HAVE_CELT051
> >  void PlaybackChannel::handle_celt_data(RedPeer::InMessage* message)
> >  {
> >      SpiceMsgPlaybackPacket* packet = (SpiceMsgPlaybackPacket*)message->data();
> > @@ -352,6 +366,7 @@ void PlaybackChannel::handle_celt_data(RedPeer::InMessage* message)
> >      }
> >      _wave_player->write((uint8_t *)pcm);
> >  }
> > +#endif
> >  
> >  class PlaybackFactory: public ChannelFactory {
> >  public:
> > diff --git a/client/record_channel.cpp b/client/record_channel.cpp
> > index d9332c6..dbf8344 100644
> > --- a/client/record_channel.cpp
> > +++ b/client/record_channel.cpp
> > @@ -72,8 +72,10 @@ RecordChannel::RecordChannel(RedClient& client, uint32_t id)
> >      : RedChannel(client, SPICE_CHANNEL_RECORD, id, new RecordHandler(*this))
> >      , _wave_recorder (NULL)
> >      , _mode (SPICE_AUDIO_DATA_MODE_INVALID)
> > +#if HAVE_CELT051
> >      , _celt_mode (NULL)
> >      , _celt_encoder (NULL)
> > +#endif
> >  {
> >      for (int i = 0; i < NUM_SAMPLES_MESSAGES; i++) {
> >          _messages.push_front(new RecordSamplesMessage(*this));
> > @@ -142,7 +144,11 @@ void RecordChannel::handle_start(RedPeer::InMessage* message)
> >  
> >      handler->set_handler(SPICE_MSG_RECORD_START, NULL);
> >      handler->set_handler(SPICE_MSG_RECORD_STOP, &RecordChannel::handle_stop);
> > +#if HAVE_CELT051
> >      ASSERT(!_wave_recorder && !_celt_mode && !_celt_encoder);
> > +#else
> > +    ASSERT(!_wave_recorder);
> > +#endif
> >  
> >      // for now support only one setting
> >      if (start->format != SPICE_AUDIO_FMT_S16) {
> > @@ -160,8 +166,9 @@ void RecordChannel::handle_start(RedPeer::InMessage* message)
> >      }
> >  
> >      int frame_size = 256;
> > -    int celt_mode_err;
> >      _frame_bytes = frame_size * bits_per_sample * start->channels / 8;
> > +#if HAVE_CELT051
> > +    int celt_mode_err;
> >      if (!(_celt_mode = celt051_mode_create(start->frequency, start->channels, frame_size,
> >                                             &celt_mode_err))) {
> >          THROW("create celt mode failed %d", celt_mode_err);
> > @@ -170,6 +177,7 @@ void RecordChannel::handle_start(RedPeer::InMessage* message)
> >      if (!(_celt_encoder = celt051_encoder_create(_celt_mode))) {
> >          THROW("create celt encoder failed");
> >      }
> > +#endif
> >  
> >      send_start_mark();
> >      _wave_recorder->start();
> > @@ -182,6 +190,7 @@ void RecordChannel::clear()
> >          delete _wave_recorder;
> >          _wave_recorder = NULL;
> >      }
> > +#if HAVE_CELT051
> >      if (_celt_encoder) {
> >          celt051_encoder_destroy(_celt_encoder);
> >          _celt_encoder = NULL;
> > @@ -190,6 +199,7 @@ void RecordChannel::clear()
> >          celt051_mode_destroy(_celt_mode);
> >          _celt_mode = NULL;
> >      }
> > +#endif
> >  }
> >  
> >  void RecordChannel::handle_stop(RedPeer::InMessage* message)
> > @@ -200,7 +210,9 @@ void RecordChannel::handle_stop(RedPeer::InMessage* message)
> >      if (!_wave_recorder) {
> >          return;
> >      }
> > +#if HAVE_CELT051
> >      ASSERT(_celt_mode && _celt_encoder);
> > +#endif
> >      clear();
> >  }
> >  
> > @@ -254,8 +266,9 @@ void RecordChannel::push_frame(uint8_t *frame)
> >          DBG(0, "blocked");
> >          return;
> >      }
> > -    uint8_t celt_buf[CELT_COMPRESSED_FRAME_BYTES];
> >      int n;
> > +#if HAVE_CELT051
> > +    uint8_t celt_buf[CELT_COMPRESSED_FRAME_BYTES];
> >  
> >      if (_mode == SPICE_AUDIO_DATA_MODE_CELT_0_5_1) {
> >          n = celt051_encode(_celt_encoder, (celt_int16_t *)frame, NULL, celt_buf,
> > @@ -264,7 +277,9 @@ void RecordChannel::push_frame(uint8_t *frame)
> >              THROW("celt encode failed");
> >          }
> >          frame = celt_buf;
> > -    } else {
> > +    } else
> > +#endif
> > +    {
> >          n = _frame_bytes;
> >      }
> >      RedPeer::OutMessage& peer_message = message->peer_message();
> > diff --git a/configure.ac b/configure.ac
> > index 66f9d12..21bd326 100644
> > --- a/configure.ac
> > +++ b/configure.ac
> > @@ -125,6 +125,9 @@ AM_CONDITIONAL(SUPPORT_SMARTCARD, test "x$enable_smartcard" != "xno")
> >  if test "x$enable_smartcard" = "xyes"; then
> >     AC_DEFINE([USE_SMARTCARD], [1], [Define if supporting smartcard proxying])
> >  fi
> > +AC_ARG_ENABLE(celt051,
> > +[  --disable-celt051       Disable celt051 audio codec (enabled by default)],,
> > +[enable_celt051="yes"])
> >  
> >  AC_ARG_ENABLE(client,
> >  [  --enable-client         Enable spice client],,
> > @@ -220,11 +223,14 @@ AC_SUBST(PIXMAN_CFLAGS)
> >  AC_SUBST(PIXMAN_LIBS)
> >  SPICE_REQUIRES+=" pixman-1 >= 0.17.7"
> >  
> > -PKG_CHECK_MODULES(CELT051, celt051 >= 0.5.1.1)
> > -AC_SUBST(CELT051_CFLAGS)
> > -AC_SUBST(CELT051_LIBS)
> > -AC_SUBST(CELT051_LIBDIR)
> > -SPICE_REQUIRES+=" celt051 >= 0.5.1.1"
> > +if test "x$enable_celt051" = "xyes"; then
> > +    PKG_CHECK_MODULES(CELT051, celt051 >= 0.5.1.1)
> > +    SPICE_REQUIRES+=" celt051 >= 0.5.1.1"
> > +    AC_DEFINE([HAVE_CELT051], 1, [Define if we have celt051 codec])
> > +    AC_SUBST(CELT051_CFLAGS)
> > +    AC_SUBST(CELT051_LIBS)
> > +    AC_SUBST(CELT051_LIBDIR)
> > +fi
> >  
> >  if test ! -e client/generated_marshallers.cpp; then
> >  AC_MSG_CHECKING([for pyparsing python module])
> > diff --git a/server/snd_worker.c b/server/snd_worker.c
> > index 3599c6f..f0588ad 100644
> > --- a/server/snd_worker.c
> > +++ b/server/snd_worker.c
> > @@ -25,7 +25,9 @@
> >  #include <sys/socket.h>
> >  #include <netinet/ip.h>
> >  #include <netinet/tcp.h>
> > +#if HAVE_CELT051
> >  #include <celt051/celt.h>
> > +#endif
> >  
> >  #include "common/marshaller.h"
> >  #include "common/generated_server_marshallers.h"
> > @@ -136,12 +138,14 @@ typedef struct PlaybackChannel {
> >      AudioFrame *free_frames;
> >      AudioFrame *in_progress;
> >      AudioFrame *pending_frame;
> > +    uint32_t mode;
> > +#if HAVE_CELT051
> >      CELTMode *celt_mode;
> >      CELTEncoder *celt_encoder;
> > -    uint32_t mode;
> >      struct {
> >          uint8_t celt_buf[CELT_COMPRESSED_FRAME_BYTES];
> >      } send_data;
> > +#endif
> >  } PlaybackChannel;
> >  
> >  struct SndWorker {
> > @@ -187,13 +191,21 @@ typedef struct RecordChannel {
> >      uint32_t mode;
> >      uint32_t mode_time;
> >      uint32_t start_time;
> > +#if HAVE_CELT051
> >      CELTDecoder *celt_decoder;
> >      CELTMode *celt_mode;
> >      uint32_t celt_buf[FRAME_SIZE];
> > +#endif
> >  } RecordChannel;
> >  
> >  static SndWorker *workers;
> > -static uint32_t playback_compression = SPICE_AUDIO_DATA_MODE_CELT_0_5_1;
> > +static uint32_t playback_compression =
> > +#if HAVE_CELT051
> > +    SPICE_AUDIO_DATA_MODE_CELT_0_5_1
> > +#else
> > +    SPICE_AUDIO_DATA_MODE_RAW
> > +#endif
> > +    ;
> >  
> >  static void snd_receive(void* data);
> >  
> > @@ -322,6 +334,7 @@ static int snd_record_handle_write(RecordChannel *record_channel, size_t size, v
> >      packet = (SpiceMsgcRecordPacket *)message;
> >      size = packet->data_size;
> >  
> > +#if HAVE_CELT051
> >      if (record_channel->mode == SPICE_AUDIO_DATA_MODE_CELT_0_5_1) {
> >          int celt_err = celt051_decode(record_channel->celt_decoder, packet->data, size,
> >                                        (celt_int16_t *)record_channel->celt_buf);
> > @@ -331,7 +344,9 @@ static int snd_record_handle_write(RecordChannel *record_channel, size_t size, v
> >          }
> >          data = record_channel->celt_buf;
> >          size = FRAME_SIZE;
> > -    } else if (record_channel->mode == SPICE_AUDIO_DATA_MODE_RAW) {
> > +    } else
> > +#endif
> > +    if (record_channel->mode == SPICE_AUDIO_DATA_MODE_RAW) {
> >          data = (uint32_t *)packet->data;
> >          size = size >> 2;
> >          size = MIN(size, RECORD_SAMPLES_SIZE);
> > @@ -386,8 +401,11 @@ static int snd_record_handle_message(SndChannel *channel, size_t size, uint32_t
> >          SpiceMsgcRecordMode *mode = (SpiceMsgcRecordMode *)message;
> >          record_channel->mode = mode->mode;
> >          record_channel->mode_time = mode->time;
> > -        if (record_channel->mode != SPICE_AUDIO_DATA_MODE_CELT_0_5_1 &&
> > -                                                  record_channel->mode != SPICE_AUDIO_DATA_MODE_RAW) {
> > +        if (record_channel->mode != SPICE_AUDIO_DATA_MODE_RAW
> > +#if HAVE_CELT051
> > +            && record_channel->mode != SPICE_AUDIO_DATA_MODE_CELT_0_5_1
> > +#endif
> > +            ) {
> >              spice_printerr("unsupported mode");
> >          }
> >          break;
> > @@ -779,6 +797,7 @@ static int snd_playback_send_write(PlaybackChannel *playback_channel)
> >  
> >      spice_marshall_msg_playback_data(channel->send_data.marshaller, &msg);
> >  
> > +#if HAVE_CELT051
> >      if (playback_channel->mode == SPICE_AUDIO_DATA_MODE_CELT_0_5_1) {
> >          int n = celt051_encode(playback_channel->celt_encoder, (celt_int16_t *)frame->samples, NULL,
> >                                 playback_channel->send_data.celt_buf, CELT_COMPRESSED_FRAME_BYTES);
> > @@ -789,7 +808,9 @@ static int snd_playback_send_write(PlaybackChannel *playback_channel)
> >          }
> >          spice_marshaller_add_ref(channel->send_data.marshaller,
> >                                   playback_channel->send_data.celt_buf, n);
> > -    } else {
> > +    } else
> > +#endif
> > +    {
> >          spice_marshaller_add_ref(channel->send_data.marshaller,
> >                                   (uint8_t *)frame->samples, sizeof(frame->samples));
> >      }
> > @@ -1157,8 +1178,10 @@ static void snd_playback_cleanup(SndChannel *channel)
> >          reds_enable_mm_timer();
> >      }
> >  
> > +#if HAVE_CELT051
> >      celt051_encoder_destroy(playback_channel->celt_encoder);
> >      celt051_mode_destroy(playback_channel->celt_mode);
> > +#endif
> >  }
> >  
> >  static void snd_set_playback_peer(RedChannel *channel, RedClient *client, RedsStream *stream,
> > @@ -1168,13 +1191,13 @@ static void snd_set_playback_peer(RedChannel *channel, RedClient *client, RedsSt
> >      SndWorker *worker = channel->data;
> >      PlaybackChannel *playback_channel;
> >      SpicePlaybackState *st = SPICE_CONTAINEROF(worker, SpicePlaybackState, worker);
> > -    CELTEncoder *celt_encoder;
> > -    CELTMode *celt_mode;
> > -    int celt_error;
> > -    RedChannelClient *rcc;
> >  
> >      snd_disconnect_channel(worker->connection);
> >  
> > +#if HAVE_CELT051
> > +    CELTEncoder *celt_encoder;
> > +    CELTMode *celt_mode;
> > +    int celt_error;
> >      if (!(celt_mode = celt051_mode_create(SPICE_INTERFACE_PLAYBACK_FREQ,
> >                                            SPICE_INTERFACE_PLAYBACK_CHAN,
> >                                            FRAME_SIZE, &celt_error))) {
> > @@ -1186,6 +1209,7 @@ static void snd_set_playback_peer(RedChannel *channel, RedClient *client, RedsSt
> >          spice_printerr("create celt encoder failed");
> >          goto error_1;
> >      }
> > +#endif
> >  
> >      if (!(playback_channel = (PlaybackChannel *)__new_channel(worker,
> >                                                                sizeof(*playback_channel),
> > @@ -1202,16 +1226,20 @@ static void snd_set_playback_peer(RedChannel *channel, RedClient *client, RedsSt
> >          goto error_2;
> >      }
> >      worker->connection = &playback_channel->base;
> > -    rcc = playback_channel->base.channel_client;
> >      snd_playback_free_frame(playback_channel, &playback_channel->frames[0]);
> >      snd_playback_free_frame(playback_channel, &playback_channel->frames[1]);
> >      snd_playback_free_frame(playback_channel, &playback_channel->frames[2]);
> >  
> > +#if HAVE_CELT051
> >      playback_channel->celt_mode = celt_mode;
> >      playback_channel->celt_encoder = celt_encoder;
> > -    playback_channel->mode = red_channel_client_test_remote_cap(rcc,
> > -                                                                SPICE_PLAYBACK_CAP_CELT_0_5_1) ?
> > +    playback_channel->mode =
> > +       red_channel_client_test_remote_cap(playback_channel->base.channel_client,
> > +                                          SPICE_PLAYBACK_CAP_CELT_0_5_1) ?
> >          playback_compression : SPICE_AUDIO_DATA_MODE_RAW;
> > +#else
> > +    playback_channel->mode = SPICE_AUDIO_DATA_MODE_RAW;
> > +#endif
> >  
> >      on_new_playback_channel(worker);
> >      if (worker->active) {
> > @@ -1221,10 +1249,13 @@ static void snd_set_playback_peer(RedChannel *channel, RedClient *client, RedsSt
> >      return;
> >  
> >  error_2:
> > +#if HAVE_CELT051
> >      celt051_encoder_destroy(celt_encoder);
> >  
> >  error_1:
> >      celt051_mode_destroy(celt_mode);
> > +#endif
> > +    return;
> >  }
> >  
> >  static void snd_record_migrate_channel_client(RedChannelClient *rcc)
> > @@ -1365,10 +1396,12 @@ static void on_new_record_channel(SndWorker *worker)
> >  
> >  static void snd_record_cleanup(SndChannel *channel)
> >  {
> > +#if HAVE_CELT051
> >      RecordChannel *record_channel = SPICE_CONTAINEROF(channel, RecordChannel, base);
> >  
> >      celt051_decoder_destroy(record_channel->celt_decoder);
> >      celt051_mode_destroy(record_channel->celt_mode);
> > +#endif
> >  }
> >  
> >  static void snd_set_record_peer(RedChannel *channel, RedClient *client, RedsStream *stream,
> > @@ -1378,12 +1411,13 @@ static void snd_set_record_peer(RedChannel *channel, RedClient *client, RedsStre
> >      SndWorker *worker = channel->data;
> >      RecordChannel *record_channel;
> >      SpiceRecordState *st = SPICE_CONTAINEROF(worker, SpiceRecordState, worker);
> > -    CELTDecoder *celt_decoder;
> > -    CELTMode *celt_mode;
> > -    int celt_error;
> >  
> >      snd_disconnect_channel(worker->connection);
> >  
> > +#if HAVE_CELT051
> > +    CELTDecoder *celt_decoder;
> > +    CELTMode *celt_mode;
> > +    int celt_error;
> >      if (!(celt_mode = celt051_mode_create(SPICE_INTERFACE_RECORD_FREQ,
> >                                            SPICE_INTERFACE_RECORD_CHAN,
> >                                            FRAME_SIZE, &celt_error))) {
> > @@ -1395,6 +1429,7 @@ static void snd_set_record_peer(RedChannel *channel, RedClient *client, RedsStre
> >          spice_printerr("create celt decoder failed");
> >          goto error_1;
> >      }
> > +#endif
> >  
> >      if (!(record_channel = (RecordChannel *)__new_channel(worker,
> >                                                            sizeof(*record_channel),
> > @@ -1413,8 +1448,10 @@ static void snd_set_record_peer(RedChannel *channel, RedClient *client, RedsStre
> >  
> >      worker->connection = &record_channel->base;
> >  
> > +#if HAVE_CELT051
> >      record_channel->celt_mode = celt_mode;
> >      record_channel->celt_decoder = celt_decoder;
> > +#endif
> >  
> >      on_new_record_channel(worker);
> >      if (worker->active) {
> > @@ -1424,10 +1461,13 @@ static void snd_set_record_peer(RedChannel *channel, RedClient *client, RedsStre
> >      return;
> >  
> >  error_2:
> > +#if HAVE_CELT051
> >      celt051_decoder_destroy(celt_decoder);
> >  
> >  error_1:
> >      celt051_mode_destroy(celt_mode);
> > +#endif
> > +    return;
> >  }
> >  
> >  static void snd_playback_migrate_channel_client(RedChannelClient *rcc)
> > @@ -1483,7 +1523,9 @@ void snd_attach_playback(SpicePlaybackInstance *sin)
> >      client_cbs.migrate = snd_playback_migrate_channel_client;
> >      red_channel_register_client_cbs(channel, &client_cbs);
> >      red_channel_set_data(channel, playback_worker);
> > +#if HAVE_CELT051
> >      red_channel_set_cap(channel, SPICE_PLAYBACK_CAP_CELT_0_5_1);
> > +#endif
> >      red_channel_set_cap(channel, SPICE_PLAYBACK_CAP_VOLUME);
> >  
> >      playback_worker->base_channel = channel;
> > @@ -1510,7 +1552,9 @@ void snd_attach_record(SpiceRecordInstance *sin)
> >      client_cbs.migrate = snd_record_migrate_channel_client;
> >      red_channel_register_client_cbs(channel, &client_cbs);
> >      red_channel_set_data(channel, record_worker);
> > +#if HAVE_CELT051
> >      red_channel_set_cap(channel, SPICE_RECORD_CAP_CELT_0_5_1);
> > +#endif
> >      red_channel_set_cap(channel, SPICE_RECORD_CAP_VOLUME);
> >  
> >      record_worker->base_channel = channel;
> > @@ -1557,7 +1601,11 @@ void snd_set_playback_compression(int on)
> >  {
> >      SndWorker *now = workers;
> >  
> > -    playback_compression = on ? SPICE_AUDIO_DATA_MODE_CELT_0_5_1 : SPICE_AUDIO_DATA_MODE_RAW;
> > +    playback_compression =
> > +#if HAVE_CELT051
> > +       on ? SPICE_AUDIO_DATA_MODE_CELT_0_5_1 :
> > +#endif
> > +       SPICE_AUDIO_DATA_MODE_RAW;
> >      for (; now; now = now->next) {
> >          if (now->base_channel->type == SPICE_CHANNEL_PLAYBACK && now->connection) {
> >              SndChannel* sndchannel = now->connection;
> > -- 
> > 1.7.10
> > 
> > _______________________________________________
> > Spice-devel mailing list
> > Spice-devel at lists.freedesktop.org
> > http://lists.freedesktop.org/mailman/listinfo/spice-devel



> _______________________________________________
> Spice-devel mailing list
> Spice-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/spice-devel



More information about the Spice-devel mailing list