Home | History | Annotate | Download | only in sound
      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 
     18 namespace rtc {
     19 
     20 class AlsaStream;
     21 class AlsaInputStream;
     22 class AlsaOutputStream;
     23 
     24 // Sound system implementation for ALSA, the predominant sound device API on
     25 // Linux (but typically not used directly by applications anymore).
     26 class 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