• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef REMOTING_CLIENT_AUDIO_PLAYER_H_
6 #define REMOTING_CLIENT_AUDIO_PLAYER_H_
7 
8 #include <list>
9 
10 #include "base/memory/scoped_ptr.h"
11 #include "base/synchronization/lock.h"
12 #include "remoting/proto/audio.pb.h"
13 
14 namespace remoting {
15 
16 class AudioPlayer {
17  public:
18   virtual ~AudioPlayer();
19 
20   void ProcessAudioPacket(scoped_ptr<AudioPacket> packet);
21 
22  protected:
23   AudioPlayer();
24 
25   // Return the recommended number of samples to include in a frame.
26   virtual uint32 GetSamplesPerFrame() = 0;
27 
28   // Resets the audio player and starts playback.
29   // Returns true on success.
30   virtual bool ResetAudioPlayer(AudioPacket::SamplingRate sampling_rate) = 0;
31 
32   // Function called by the browser when it needs more audio samples.
33   static void AudioPlayerCallback(void* samples,
34                                   uint32 buffer_size,
35                                   void* data);
36 
37  private:
38   friend class AudioPlayerTest;
39 
40   typedef std::list<AudioPacket*> AudioPacketQueue;
41 
42   void ResetQueue();
43   void FillWithSamples(void* samples, uint32 buffer_size);
44 
45   AudioPacket::SamplingRate sampling_rate_;
46 
47   bool start_failed_;
48 
49   // Protects |queued_packets_|, |queued_samples_ and |bytes_consumed_|. This is
50   // necessary to prevent races, because Pepper will call the  callback on a
51   // separate thread.
52   base::Lock lock_;
53 
54   AudioPacketQueue queued_packets_;
55   int queued_bytes_;
56 
57   // The number of bytes from |queued_packets_| that have been consumed.
58   size_t bytes_consumed_;
59 
60   DISALLOW_COPY_AND_ASSIGN(AudioPlayer);
61 };
62 
63 }  // namespace remoting
64 
65 #endif  // REMOTING_CLIENT_AUDIO_PLAYER_H_
66