blob: f95e68618d4a33900d1f8f0d76b0b629be2789a5 [file] [log] [blame]
henrike@webrtc.org91bac042014-08-26 22:04:04 +00001/*
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_