| Index: media/audio/audio_output_mixer.h
|
| ===================================================================
|
| --- media/audio/audio_output_mixer.h (revision 0)
|
| +++ media/audio/audio_output_mixer.h (revision 0)
|
| @@ -0,0 +1,92 @@
|
| +// Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +// AudioOutputMixer is a class that implements browser-side audio mixer.
|
| +// AudioOutputMixer implements both AudioOutputDispatcher and
|
| +// AudioSourceCallback interfaces.
|
| +
|
| +#ifndef MEDIA_AUDIO_AUDIO_OUTPUT_MIXER_H_
|
| +#define MEDIA_AUDIO_AUDIO_OUTPUT_MIXER_H_
|
| +
|
| +#include <map>
|
| +
|
| +#include "base/basictypes.h"
|
| +#include "base/memory/ref_counted.h"
|
| +#include "base/memory/scoped_ptr.h"
|
| +#include "base/memory/weak_ptr.h"
|
| +#include "base/synchronization/lock.h"
|
| +#include "base/timer.h"
|
| +#include "media/audio/audio_io.h"
|
| +#include "media/audio/audio_manager.h"
|
| +#include "media/audio/audio_output_dispatcher.h"
|
| +#include "media/audio/audio_parameters.h"
|
| +
|
| +namespace media {
|
| +
|
| +class MEDIA_EXPORT AudioOutputMixer
|
| + : public AudioOutputDispatcher,
|
| + public AudioOutputStream::AudioSourceCallback {
|
| + public:
|
| + AudioOutputMixer(AudioManager* audio_manager,
|
| + const AudioParameters& params,
|
| + const base::TimeDelta& close_delay);
|
| +
|
| + // AudioOutputDispatcher interface.
|
| + virtual bool OpenStream() OVERRIDE;
|
| + virtual bool StartStream(AudioOutputStream::AudioSourceCallback* callback,
|
| + AudioOutputProxy* stream_proxy) OVERRIDE;
|
| + virtual void StopStream(AudioOutputProxy* stream_proxy) OVERRIDE;
|
| + virtual void StreamVolumeSet(AudioOutputProxy* stream_proxy,
|
| + double volume) OVERRIDE;
|
| + virtual void CloseStream(AudioOutputProxy* stream_proxy) OVERRIDE;
|
| + virtual void Shutdown() OVERRIDE;
|
| +
|
| + // AudioSourceCallback interface.
|
| + virtual uint32 OnMoreData(AudioOutputStream* stream,
|
| + uint8* dest,
|
| + uint32 max_size,
|
| + AudioBuffersState buffers_state) OVERRIDE;
|
| + virtual void OnError(AudioOutputStream* stream, int code) OVERRIDE;
|
| + virtual void WaitTillDataReady() OVERRIDE;
|
| +
|
| + private:
|
| + friend class base::RefCountedThreadSafe<AudioOutputMixer>;
|
| + virtual ~AudioOutputMixer();
|
| +
|
| + // Called by |close_timer_|. Closes physical stream.
|
| + void ClosePhysicalStream();
|
| +
|
| + // The |lock_| must be acquired whenever we modify |proxies_| in the audio
|
| + // manager thread or accessing it in the hardware audio thread. Read in the
|
| + // audio manager thread is safe.
|
| + base::Lock lock_;
|
| +
|
| + // List of audio output proxies currently being played.
|
| + // For every proxy we store aux structure containing data necessary for
|
| + // mixing.
|
| + struct ProxyData {
|
| + AudioOutputStream::AudioSourceCallback* audio_source_callback;
|
| + double volume;
|
| + int pending_bytes;
|
| + };
|
| + typedef std::map<AudioOutputProxy*, ProxyData> ProxyMap;
|
| + ProxyMap proxies_;
|
| +
|
| + // Physical stream for this mixer.
|
| + scoped_ptr<AudioOutputStream> physical_stream_;
|
| +
|
| + // Temporary buffer used when mixing. Allocated in the constructor
|
| + // to avoid constant allocation/deallocation in the callback.
|
| + scoped_array<uint8> mixer_data_;
|
| +
|
| + // Used to post delayed tasks to ourselves that we cancel inside Shutdown().
|
| + base::WeakPtrFactory<AudioOutputMixer> weak_this_;
|
| + base::DelayTimer<AudioOutputMixer> close_timer_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(AudioOutputMixer);
|
| +};
|
| +
|
| +} // namespace media
|
| +
|
| +#endif // MEDIA_AUDIO_AUDIO_OUTPUT_MIXER_H_
|
|
|