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_ALSASOUNDSYSTEM_H_
12#define WEBRTC_SOUND_ALSASOUNDSYSTEM_H_
13
14#include "webrtc/sound/alsasymboltable.h"
15#include "webrtc/sound/soundsysteminterface.h"
16#include "webrtc/base/constructormagic.h"
17
18namespace rtc {
19
20class AlsaStream;
21class AlsaInputStream;
22class AlsaOutputStream;
23
24// Sound system implementation for ALSA, the predominant sound device API on
25// Linux (but typically not used directly by applications anymore).
26class AlsaSoundSystem : public SoundSystemInterface {
27  friend class AlsaStream;
28  friend class AlsaInputStream;
29  friend class AlsaOutputStream;
30 public:
31  static SoundSystemInterface *Create() {
32    return new AlsaSoundSystem();
33  }
34
35  AlsaSoundSystem();
36
37  virtual ~AlsaSoundSystem();
38
39  virtual bool Init();
40  virtual void Terminate();
41
42  virtual bool EnumeratePlaybackDevices(SoundDeviceLocatorList *devices);
43  virtual bool EnumerateCaptureDevices(SoundDeviceLocatorList *devices);
44
45  virtual bool GetDefaultPlaybackDevice(SoundDeviceLocator **device);
46  virtual bool GetDefaultCaptureDevice(SoundDeviceLocator **device);
47
48  virtual SoundOutputStreamInterface *OpenPlaybackDevice(
49      const SoundDeviceLocator *device,
50      const OpenParams &params);
51  virtual SoundInputStreamInterface *OpenCaptureDevice(
52      const SoundDeviceLocator *device,
53      const OpenParams &params);
54
55  virtual const char *GetName() const;
56
57 private:
58  bool IsInitialized() { return initialized_; }
59
60  bool EnumerateDevices(SoundDeviceLocatorList *devices,
61                        bool capture_not_playback);
62
63  bool GetDefaultDevice(SoundDeviceLocator **device);
64
65  static size_t FrameSize(const OpenParams &params);
66
67  template <typename StreamInterface>
68  StreamInterface *OpenDevice(
69      const SoundDeviceLocator *device,
70      const OpenParams &params,
71      snd_pcm_stream_t type,
72      StreamInterface *(AlsaSoundSystem::*start_fn)(
73          snd_pcm_t *handle,
74          size_t frame_size,
75          int wait_timeout_ms,
76          int flags,
77          int freq));
78
79  SoundOutputStreamInterface *StartOutputStream(
80      snd_pcm_t *handle,
81      size_t frame_size,
82      int wait_timeout_ms,
83      int flags,
84      int freq);
85
86  SoundInputStreamInterface *StartInputStream(
87      snd_pcm_t *handle,
88      size_t frame_size,
89      int wait_timeout_ms,
90      int flags,
91      int freq);
92
93  const char *GetError(int err);
94
95  bool initialized_;
96  AlsaSymbolTable symbol_table_;
97
98  DISALLOW_COPY_AND_ASSIGN(AlsaSoundSystem);
99};
100
101}  // namespace rtc
102
103#endif  // WEBRTC_SOUND_ALSASOUNDSYSTEM_H_
104