Bug 1221587: Patch 2 - Win32 fixes for cubeb full-duplex patch draft
authorRandell Jesup <rjesup@wgate.com>
Sun, 10 Jan 2016 21:30:58 -0500
changeset 321190 531f8e0e659bda142bc78de01dd42dc7cd48347e
parent 321189 0eb3efbcb9a1fb71b14f47b2a9baacab11d22f2c
child 321191 b99d41fe0935abc1a75ce60661d7419db850c6f0
push id9349
push userrjesup@wgate.com
push dateWed, 13 Jan 2016 06:48:48 +0000
bugs1221587
milestone46.0a1
Bug 1221587: Patch 2 - Win32 fixes for cubeb full-duplex patch
media/libcubeb/src/cubeb_alsa.c
media/libcubeb/src/cubeb_pulse.c
media/libcubeb/src/cubeb_resampler.cpp
media/libcubeb/src/cubeb_resampler.h
--- a/media/libcubeb/src/cubeb_alsa.c
+++ b/media/libcubeb/src/cubeb_alsa.c
@@ -301,17 +301,17 @@ alsa_refill_stream(cubeb_stream * stm)
       return ERROR;
     }
   }
 
   p = calloc(1, snd_pcm_frames_to_bytes(stm->pcm, avail));
   assert(p);
 
   pthread_mutex_unlock(&stm->mutex);
-  got = stm->data_callback(stm, stm->user_ptr, p, avail);
+  got = stm->data_callback(stm, stm->user_ptr, NULL, p, avail);
   pthread_mutex_lock(&stm->mutex);
   if (got < 0) {
     pthread_mutex_unlock(&stm->mutex);
     stm->state_callback(stm, stm->user_ptr, CUBEB_STATE_ERROR);
     return ERROR;
   }
   if (got > 0) {
     snd_pcm_sframes_t wrote;
--- a/media/libcubeb/src/cubeb_pulse.c
+++ b/media/libcubeb/src/cubeb_pulse.c
@@ -193,17 +193,17 @@ stream_request_callback(pa_stream * s, s
 
   while (towrite) {
     size = towrite;
     r = WRAP(pa_stream_begin_write)(s, &buffer, &size);
     assert(r == 0);
     assert(size > 0);
     assert(size % frame_size == 0);
 
-    got = stm->data_callback(stm, stm->user_ptr, buffer, size / frame_size);
+    got = stm->data_callback(stm, stm->user_ptr, NULL, buffer, size / frame_size);
     if (got < 0) {
       WRAP(pa_stream_cancel_write)(s);
       stm->shutdown = 1;
       return;
     }
 
     if (stm->volume != PULSE_NO_GAIN) {
       uint32_t samples =  size * stm->sample_spec.channels / frame_size ;
--- a/media/libcubeb/src/cubeb_resampler.cpp
+++ b/media/libcubeb/src/cubeb_resampler.cpp
@@ -64,34 +64,34 @@ to_speex_quality(cubeb_resampler_quality
   default:
     assert(false);
     return 0XFFFFFFFF;
   }
 }
 } // end of anonymous namespace
 
 struct cubeb_resampler {
-  virtual long fill(void * buffer, long frames_needed) = 0;
+  virtual long fill(void * input_buffer, void * buffer, long frames_needed) = 0;
   virtual ~cubeb_resampler() {}
 };
 
 class noop_resampler : public cubeb_resampler {
 public:
   noop_resampler(cubeb_stream * s,
                  cubeb_data_callback cb,
                  void * ptr)
     : stream(s)
     , data_callback(cb)
     , user_ptr(ptr)
   {
   }
 
-  virtual long fill(void * buffer, long frames_needed)
+  virtual long fill(void * input_buffer, void * buffer, long frames_needed)
   {
-    long got = data_callback(stream, user_ptr, buffer, frames_needed);
+    long got = data_callback(stream, user_ptr, input_buffer, buffer, frames_needed);
     assert(got <= frames_needed);
     return got;
   }
 
 private:
   cubeb_stream * const stream;
   const cubeb_data_callback data_callback;
   void * const user_ptr;
@@ -101,17 +101,17 @@ class cubeb_resampler_speex : public cub
 public:
   cubeb_resampler_speex(SpeexResamplerState * r, cubeb_stream * s,
                         cubeb_stream_params params, uint32_t out_rate,
                         cubeb_data_callback cb, long max_count,
                         void * ptr);
 
   virtual ~cubeb_resampler_speex();
 
-  virtual long fill(void * buffer, long frames_needed);
+  virtual long fill(void * input_buffer, void * buffer, long frames_needed);
 
 private:
   SpeexResamplerState * const speex_resampler;
   cubeb_stream * const stream;
   const cubeb_stream_params stream_params;
   const cubeb_data_callback data_callback;
   void * const user_ptr;
 
@@ -156,31 +156,31 @@ cubeb_resampler_speex::cubeb_resampler_s
 }
 
 cubeb_resampler_speex::~cubeb_resampler_speex()
 {
   speex_resampler_destroy(speex_resampler);
 }
 
 long
-cubeb_resampler_speex::fill(void * buffer, long frames_needed)
+cubeb_resampler_speex::fill(void * input_buffer, void * buffer, long frames_needed)
 {
   // Use more input frames than strictly necessary, so in the worst case,
   // we have leftover unresampled frames at the end, that we can use
   // during the next iteration.
   assert(frames_needed <= buffer_frame_count);
   long before_resampling = frame_count_at_rate(frames_needed, resampling_ratio);
   long frames_requested = before_resampling - leftover_frame_count;
 
   // Copy the previous leftover frames to the front of the buffer.
   size_t leftover_bytes = frames_to_bytes(stream_params, leftover_frame_count);
   memcpy(resampling_src_buffer.get(), leftover_frames_buffer.get(), leftover_bytes);
   uint8_t * buffer_start = resampling_src_buffer.get() + leftover_bytes;
 
-  long got = data_callback(stream, user_ptr, buffer_start, frames_requested);
+  long got = data_callback(stream, user_ptr, input_buffer, buffer_start, frames_requested);
   assert(got <= frames_requested);
 
   if (got < 0) {
     return CUBEB_ERROR;
   }
 
   uint32_t in_frames = leftover_frame_count + got;
   uint32_t out_frames = frames_needed;
@@ -234,18 +234,19 @@ cubeb_resampler_create(cubeb_stream * st
                                      callback, buffer_frame_count, user_ptr);
   }
 
   return new noop_resampler(stream, callback, user_ptr);
 }
 
 long
 cubeb_resampler_fill(cubeb_resampler * resampler,
-                     void * buffer, long frames_needed)
+                     void * input_buffer, void * buffer,
+		     long frames_needed)
 {
-  return resampler->fill(buffer, frames_needed);
+  return resampler->fill(input_buffer, buffer, frames_needed);
 }
 
 void
 cubeb_resampler_destroy(cubeb_resampler * resampler)
 {
   delete resampler;
 }
--- a/media/libcubeb/src/cubeb_resampler.h
+++ b/media/libcubeb/src/cubeb_resampler.h
@@ -48,17 +48,18 @@ cubeb_resampler * cubeb_resampler_create
  * happen if necessary.
  * @param resampler A cubeb_resampler instance.
  * @param buffer The buffer to be filled.
  * @param frames_needed Number of frames that should be produced.
  * @retval Number of frames that are actually produced.
  * @retval CUBEB_ERROR on error.
  */
 long cubeb_resampler_fill(cubeb_resampler * resampler,
-                          void * buffer, long frames_needed);
+                          void * input_buffer, void * buffer,
+			  long frames_needed);
 
 /**
  * Destroy a cubeb_resampler.
  * @param resampler A cubeb_resampler instance.
  */
 void cubeb_resampler_destroy(cubeb_resampler * resampler);
 
 #if defined(__cplusplus)