1 /*
2  *  Copyright 2004 The WebRTC Project Authors. All rights reserved.
3  *
4  *  Use of this source code is governed by a BSD-style license
5  *  that can be found in the LICENSE file in the root of the source
6  *  tree. An additional intellectual property rights grant can be found
7  *  in the file PATENTS.  All contributing project authors may
8  *  be found in the AUTHORS file in the root of the source tree.
9  */
10 
11 #ifndef WEBRTC_SOUND_SOUNDSYSTEMINTERFACE_H_
12 #define WEBRTC_SOUND_SOUNDSYSTEMINTERFACE_H_
13 
14 #include <vector>
15 
16 #include "webrtc/base/constructormagic.h"
17 
18 namespace rtc {
19 
20 class SoundDeviceLocator;
21 class SoundInputStreamInterface;
22 class SoundOutputStreamInterface;
23 
24 // Interface for a platform's sound system.
25 // Implementations must guarantee thread-safety for at least the following use
26 // cases:
27 // 1) Concurrent enumeration and opening of devices from different threads.
28 // 2) Concurrent use of different Sound(Input|Output)StreamInterface
29 // instances from different threads (but concurrent use of the _same_ one from
30 // different threads need not be supported).
31 class SoundSystemInterface {
32  public:
33   typedef std::vector<SoundDeviceLocator *> SoundDeviceLocatorList;
34 
35   enum SampleFormat {
36     // Only one supported sample format at this time.
37     // The values here may be used in lookup tables, so they shouldn't change.
38     FORMAT_S16LE = 0,
39   };
40 
41   enum Flags {
42     // Enable reporting the current stream latency in
43     // Sound(Input|Output)StreamInterface. See those classes for more details.
44     FLAG_REPORT_LATENCY = (1 << 0),
45   };
46 
47   struct OpenParams {
48     // Format for the sound stream.
49     SampleFormat format;
50     // Sampling frequency in hertz.
51     unsigned int freq;
52     // Number of channels in the PCM stream.
53     unsigned int channels;
54     // Misc flags. Should be taken from the Flags enum above.
55     int flags;
56     // Desired latency, measured as number of bytes of sample data
57     int latency;
58   };
59 
60   // Special values for the "latency" field of OpenParams.
61   // Use this one to say you don't care what the latency is. The sound system
62   // will optimize for other things instead.
63   static const int kNoLatencyRequirements = -1;
64   // Use this one to say that you want the sound system to pick an appropriate
65   // small latency value. The sound system may pick the minimum allowed one, or
66   // a slightly higher one in the event that the true minimum requires an
67   // undesirable trade-off.
68   static const int kLowLatency = 0;
69 
70   // Max value for the volume parameters for Sound(Input|Output)StreamInterface.
71   static const int kMaxVolume = 255;
72   // Min value for the volume parameters for Sound(Input|Output)StreamInterface.
73   static const int kMinVolume = 0;
74 
75   // Helper for clearing a locator list and deleting the entries.
76   static void ClearSoundDeviceLocatorList(SoundDeviceLocatorList *devices);
77 
~SoundSystemInterface()78   virtual ~SoundSystemInterface() {}
79 
80   virtual bool Init() = 0;
81   virtual void Terminate() = 0;
82 
83   // Enumerates the available devices. (Any pre-existing locators in the lists
84   // are deleted.)
85   virtual bool EnumeratePlaybackDevices(SoundDeviceLocatorList *devices) = 0;
86   virtual bool EnumerateCaptureDevices(SoundDeviceLocatorList *devices) = 0;
87 
88   // Gets a special locator for the default device.
89   virtual bool GetDefaultPlaybackDevice(SoundDeviceLocator **device) = 0;
90   virtual bool GetDefaultCaptureDevice(SoundDeviceLocator **device) = 0;
91 
92   // Opens the given device, or returns NULL on error.
93   virtual SoundOutputStreamInterface *OpenPlaybackDevice(
94       const SoundDeviceLocator *device,
95       const OpenParams &params) = 0;
96   virtual SoundInputStreamInterface *OpenCaptureDevice(
97       const SoundDeviceLocator *device,
98       const OpenParams &params) = 0;
99 
100   // A human-readable name for this sound system.
101   virtual const char *GetName() const = 0;
102 
103  protected:
SoundSystemInterface()104   SoundSystemInterface() {}
105 
106  private:
107   RTC_DISALLOW_COPY_AND_ASSIGN(SoundSystemInterface);
108 };
109 
110 }  // namespace rtc
111 
112 #endif  // WEBRTC_SOUND_SOUNDSYSTEMINTERFACE_H_
113