1 // Copyright (c) 2012 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.
5 #ifndef MEDIA_AUDIO_MAC_AUDIO_UNIFIED_MAC_H_
6 #define MEDIA_AUDIO_MAC_AUDIO_UNIFIED_MAC_H_
8 #include <CoreAudio/CoreAudio.h>
10 #include "base/memory/scoped_ptr.h"
11 #include "media/audio/audio_io.h"
12 #include "media/audio/audio_parameters.h"
16 class AudioManagerMac
;
18 // Implementation of AudioOutputStream for Mac OS X using the
19 // CoreAudio AudioHardware API suitable for low-latency unified audio I/O
20 // when using devices which support *both* input and output
21 // in the same driver. This is the case with professional
22 // USB and Firewire devices.
24 // Please note that it's required to first get the native sample-rate of the
25 // default output device and use that sample-rate when creating this object.
26 class AudioHardwareUnifiedStream
: public AudioOutputStream
{
28 // The ctor takes all the usual parameters, plus |manager| which is the
29 // the audio manager who is creating this object.
30 AudioHardwareUnifiedStream(AudioManagerMac
* manager
,
31 const AudioParameters
& params
);
32 // The dtor is typically called by the AudioManager only and it is usually
33 // triggered by calling AudioOutputStream::Close().
34 virtual ~AudioHardwareUnifiedStream();
36 // Implementation of AudioOutputStream.
37 virtual bool Open() OVERRIDE
;
38 virtual void Close() OVERRIDE
;
39 virtual void Start(AudioSourceCallback
* callback
) OVERRIDE
;
40 virtual void Stop() OVERRIDE
;
41 virtual void SetVolume(double volume
) OVERRIDE
;
42 virtual void GetVolume(double* volume
) OVERRIDE
;
44 int input_channels() const { return input_channels_
; }
45 int output_channels() const { return output_channels_
; }
48 OSStatus
Render(AudioDeviceID device
,
49 const AudioTimeStamp
* now
,
50 const AudioBufferList
* input_data
,
51 const AudioTimeStamp
* input_time
,
52 AudioBufferList
* output_data
,
53 const AudioTimeStamp
* output_time
);
55 static OSStatus
RenderProc(AudioDeviceID device
,
56 const AudioTimeStamp
* now
,
57 const AudioBufferList
* input_data
,
58 const AudioTimeStamp
* input_time
,
59 AudioBufferList
* output_data
,
60 const AudioTimeStamp
* output_time
,
63 // Our creator, the audio manager needs to be notified when we close.
64 AudioManagerMac
* manager_
;
66 // Pointer to the object that will provide the audio samples.
67 AudioSourceCallback
* source_
;
69 // Structure that holds the stream format details such as bitrate.
70 AudioStreamBasicDescription format_
;
72 // Hardware buffer size.
73 int number_of_frames_
;
75 // Number of audio channels provided to the client via OnMoreIOData().
76 int client_input_channels_
;
78 // Volume level from 0 to 1.
81 // Number of input and output channels queried from the hardware.
84 int input_channels_per_frame_
;
85 int output_channels_per_frame_
;
87 AudioDeviceIOProcID io_proc_id_
;
88 AudioDeviceID device_
;
91 // Intermediate buffers used with call to OnMoreIOData().
92 scoped_ptr
<AudioBus
> input_bus_
;
93 scoped_ptr
<AudioBus
> output_bus_
;
95 DISALLOW_COPY_AND_ASSIGN(AudioHardwareUnifiedStream
);
100 #endif // MEDIA_AUDIO_MAC_AUDIO_UNIFIED_MAC_H_