audio_buffer_queue.h revision eb525c5499e34cc9c4b825d6d9e75bb07cc06ace
1eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Copyright 2013 The Chromium Authors. All rights reserved. 2eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// found in the LICENSE file. 4eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 5eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#ifndef MEDIA_BASE_AUDIO_BUFFER_QUEUE_H_ 6eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#define MEDIA_BASE_AUDIO_BUFFER_QUEUE_H_ 7eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 8eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include <deque> 9eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 10eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/basictypes.h" 11eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/memory/scoped_ptr.h" 12eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "media/base/audio_buffer.h" 13eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "media/base/media_export.h" 14eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 15eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochnamespace media { 16eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 17eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass AudioBus; 18eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 19eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// A queue of AudioBuffers to support reading of arbitrary chunks of a media 20eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// data source. Audio data can be copied into an AudioBus for output. The 21eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// current position can be forwarded to anywhere in the buffered data. 22eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// 23eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// This class is not inherently thread-safe. Concurrent access must be 24eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// externally serialized. 25eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass MEDIA_EXPORT AudioBufferQueue { 26eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch public: 27eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch AudioBufferQueue(); 28eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ~AudioBufferQueue(); 29eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 30eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Clears the buffer queue. 31eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch void Clear(); 32eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 33eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Appends |buffer_in| to this queue. 34eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch void Append(const scoped_refptr<AudioBuffer>& buffer_in); 35eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 36eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Reads a maximum of |frames| frames into |dest| from the current position. 37eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Returns the number of frames read. The current position will advance by the 38eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // amount of frames read. 39eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch int ReadFrames(int frames, AudioBus* dest); 40eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 41eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Copies up to |frames| frames from current position to |dest|. Returns 42eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // number of frames copied. Doesn't advance current position. Starts at 43eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // |forward_offset| from current position. 44eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch int PeekFrames(int frames, int forward_offset, AudioBus* dest); 45eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 46eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Moves the current position forward by |frames| frames. If |frames| exceeds 47eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // frames available, the seek operation will fail. 48eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch void SeekFrames(int frames); 49eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 50eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Returns the number of frames buffered beyond the current position. 51eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch int frames() const { return frames_; } 52eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 53eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Returns the current timestamp, taking into account current offset. The 54eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // value calculated based on the timestamp of the current buffer. If timestamp 55eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // for the current buffer is set to 0, then returns value that corresponds to 56eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // the last position in a buffer that had timestamp set. kNoTimestamp() is 57eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // returned if no buffers we read from had timestamp set. 58eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::TimeDelta current_time() const { return current_time_; } 59eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 60eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch private: 61eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Definition of the buffer queue. 62eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch typedef std::deque<scoped_refptr<AudioBuffer> > BufferQueue; 63eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 64eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // An internal method shared by ReadFrames() and SeekFrames() that actually 65eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // does reading. It reads a maximum of |frames| frames into |dest|. Returns 66eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // the number of frames read. The current position will be moved forward by 67eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // the number of frames read if |advance_position| is set. If |dest| is NULL, 68eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // only the current position will advance but no data will be copied. 69eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // |forward_offset| can be used to skip frames before reading. 70eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch int InternalRead(int frames, 71eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch bool advance_position, 72eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch int forward_offset, 73eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch AudioBus* dest); 74eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 75eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Updates |current_time_| with the time that corresponds to the specified 76eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // position in the buffer. 77eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch void UpdateCurrentTime(BufferQueue::iterator buffer, int offset); 78eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 79eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch BufferQueue::iterator current_buffer_; 80eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch BufferQueue buffers_; 81eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch int current_buffer_offset_; 82eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 83eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Number of frames available to be read in the buffer. 84eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch int frames_; 85eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 86eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Keeps track of the most recent time we've seen in case the |buffers_| is 87eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // empty when our owner asks what time it is. 88eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::TimeDelta current_time_; 89eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 90eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DISALLOW_COPY_AND_ASSIGN(AudioBufferQueue); 91eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}; 92eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 93eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} // namespace media 94eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 95eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif // MEDIA_BASE_AUDIO_BUFFER_QUEUE_H_ 96