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