1// Copyright 2013 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 MEDIA_AUDIO_ALSA_AUDIO_MANAGER_ALSA_H_
6#define MEDIA_AUDIO_ALSA_AUDIO_MANAGER_ALSA_H_
7
8#include <string>
9#include "base/compiler_specific.h"
10#include "base/memory/ref_counted.h"
11#include "base/threading/thread.h"
12#include "media/audio/audio_manager_base.h"
13
14namespace media {
15
16class AlsaWrapper;
17
18class MEDIA_EXPORT AudioManagerAlsa : public AudioManagerBase {
19 public:
20  AudioManagerAlsa(AudioLogFactory* audio_log_factory);
21
22  static void ShowLinuxAudioInputSettings();
23
24  // Implementation of AudioManager.
25  virtual bool HasAudioOutputDevices() OVERRIDE;
26  virtual bool HasAudioInputDevices() OVERRIDE;
27  virtual void ShowAudioInputSettings() OVERRIDE;
28  virtual void GetAudioInputDeviceNames(
29      AudioDeviceNames* device_names) OVERRIDE;
30  virtual void GetAudioOutputDeviceNames(
31      AudioDeviceNames* device_names) OVERRIDE;
32  virtual AudioParameters GetInputStreamParameters(
33      const std::string& device_id) OVERRIDE;
34
35  // Implementation of AudioManagerBase.
36  virtual AudioOutputStream* MakeLinearOutputStream(
37      const AudioParameters& params) OVERRIDE;
38  virtual AudioOutputStream* MakeLowLatencyOutputStream(
39      const AudioParameters& params,
40      const std::string& device_id) OVERRIDE;
41  virtual AudioInputStream* MakeLinearInputStream(
42      const AudioParameters& params, const std::string& device_id) OVERRIDE;
43  virtual AudioInputStream* MakeLowLatencyInputStream(
44      const AudioParameters& params, const std::string& device_id) OVERRIDE;
45
46 protected:
47  virtual ~AudioManagerAlsa();
48
49  virtual AudioParameters GetPreferredOutputStreamParameters(
50      const std::string& output_device_id,
51      const AudioParameters& input_params) OVERRIDE;
52
53 private:
54  enum StreamType {
55    kStreamPlayback = 0,
56    kStreamCapture,
57  };
58
59  // Gets a list of available ALSA devices.
60  void GetAlsaAudioDevices(StreamType type,
61                           media::AudioDeviceNames* device_names);
62
63  // Gets the ALSA devices' names and ids that support streams of the
64  // given type.
65  void GetAlsaDevicesInfo(StreamType type,
66                          void** hint,
67                          media::AudioDeviceNames* device_names);
68
69  // Checks if the specific ALSA device is available.
70  static bool IsAlsaDeviceAvailable(StreamType type,
71                                    const char* device_name);
72
73  static const char* UnwantedDeviceTypeWhenEnumerating(
74      StreamType wanted_type);
75
76  // Returns true if a device is present for the given stream type.
77  bool HasAnyAlsaAudioDevice(StreamType stream);
78
79  // Called by MakeLinearOutputStream and MakeLowLatencyOutputStream.
80  AudioOutputStream* MakeOutputStream(const AudioParameters& params);
81
82  // Called by MakeLinearInputStream and MakeLowLatencyInputStream.
83  AudioInputStream* MakeInputStream(const AudioParameters& params,
84                                    const std::string& device_id);
85
86  scoped_ptr<AlsaWrapper> wrapper_;
87
88  DISALLOW_COPY_AND_ASSIGN(AudioManagerAlsa);
89};
90
91}  // namespace media
92
93#endif  // MEDIA_AUDIO_ALSA_AUDIO_MANAGER_ALSA_H_
94