summaryrefslogtreecommitdiffstats
path: root/media/audio/pulse
diff options
context:
space:
mode:
Diffstat (limited to 'media/audio/pulse')
-rw-r--r--media/audio/pulse/pulse_output.cc20
-rw-r--r--media/audio/pulse/pulse_output.h21
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);
};