diff options
Diffstat (limited to 'media/audio/pulse')
-rw-r--r-- | media/audio/pulse/pulse_output.cc | 20 | ||||
-rw-r--r-- | media/audio/pulse/pulse_output.h | 21 |
2 files changed, 24 insertions, 17 deletions
diff --git a/media/audio/pulse/pulse_output.cc b/media/audio/pulse/pulse_output.cc index 98f1f58..bdd29c0 100644 --- a/media/audio/pulse/pulse_output.cc +++ b/media/audio/pulse/pulse_output.cc @@ -310,10 +310,16 @@ bool PulseAudioOutputStream::BufferPacketFromSource() { // to happen in practice though. scoped_refptr<media::DataBuffer> packet = new media::DataBuffer(packet_size_); - size_t packet_size = RunDataCallback(packet->GetWritableData(), - packet->GetBufferSize(), - AudioBuffersState(buffer_delay, - hardware_delay)); + int frames_filled = RunDataCallback( + audio_bus_.get(), AudioBuffersState(buffer_delay, hardware_delay)); + size_t packet_size = frames_filled * bytes_per_frame_; + + DCHECK_LE(packet_size, packet_size_); + // Note: If this ever changes to output raw float the data must be clipped and + // sanitized since it may come from an untrusted source such as NaCl. + audio_bus_->ToInterleaved( + frames_filled, bytes_per_frame_ / channel_count_, + packet->GetWritableData()); if (packet_size == 0) return false; @@ -421,10 +427,10 @@ void PulseAudioOutputStream::GetVolume(double* volume) { *volume = volume_; } -uint32 PulseAudioOutputStream::RunDataCallback( - uint8* dest, uint32 max_size, AudioBuffersState buffers_state) { +int PulseAudioOutputStream::RunDataCallback( + AudioBus* audio_bus, AudioBuffersState buffers_state) { if (source_callback_) - return source_callback_->OnMoreData(dest, max_size, buffers_state); + return source_callback_->OnMoreData(audio_bus, buffers_state); return 0; } diff --git a/media/audio/pulse/pulse_output.h b/media/audio/pulse/pulse_output.h index 3c1cae6..1d39af4 100644 --- a/media/audio/pulse/pulse_output.h +++ b/media/audio/pulse/pulse_output.h @@ -28,8 +28,6 @@ namespace media { -class SeekableBuffer; - #if defined(OS_LINUX) class AudioManagerLinux; typedef AudioManagerLinux AudioManagerPulse; @@ -41,6 +39,7 @@ typedef AudioManagerOpenBSD AudioManagerPulse; #endif class AudioParameters; +class SeekableBuffer; class PulseAudioOutputStream : public AudioOutputStream { public: @@ -50,12 +49,12 @@ class PulseAudioOutputStream : public AudioOutputStream { virtual ~PulseAudioOutputStream(); // Implementation of AudioOutputStream. - virtual bool Open(); - virtual void Close(); - virtual void Start(AudioSourceCallback* callback); - virtual void Stop(); - virtual void SetVolume(double volume); - virtual void GetVolume(double* volume); + virtual bool Open() OVERRIDE; + virtual void Close() OVERRIDE; + virtual void Start(AudioSourceCallback* callback) OVERRIDE; + virtual void Stop() OVERRIDE; + virtual void SetVolume(double volume) OVERRIDE; + virtual void GetVolume(double* volume) OVERRIDE; private: // PulseAudio Callbacks. @@ -77,8 +76,7 @@ class PulseAudioOutputStream : public AudioOutputStream { void WriteToStream(size_t bytes_to_write, size_t* bytes_written); // API for Proxying calls to the AudioSourceCallback provided during Start(). - uint32 RunDataCallback(uint8* dest, uint32 max_size, - AudioBuffersState buffers_state); + int RunDataCallback(AudioBus* audio_bus, AudioBuffersState buffers_state); // Close() helper function to free internal structs. void Reset(); @@ -127,6 +125,9 @@ class PulseAudioOutputStream : public AudioOutputStream { // Callback to audio data source. AudioSourceCallback* source_callback_; + // Container for retrieving data from AudioSourceCallback::OnMoreData(). + scoped_ptr<AudioBus> audio_bus_; + DISALLOW_COPY_AND_ASSIGN(PulseAudioOutputStream); }; |