1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
|
/* -*- c++ -*- */
/*
* Copyright 2006,2010 Free Software Foundation, Inc.
*
* This file is part of GNU Radio.
*
* GNU Radio is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3, or (at your option)
* any later version.
*
* GNU Radio is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with GNU Radio; see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 51 Franklin Street,
* Boston, MA 02110-1301, USA.
*/
#ifndef INCLUDED_AUDIO_OSX_SOURCE_H
#define INCLUDED_AUDIO_OSX_SOURCE_H
#include <gr_sync_block.h>
#include <string>
#include <AudioToolbox/AudioToolbox.h>
#include <AudioUnit/AudioUnit.h>
#include <circular_buffer.h>
class audio_osx_source;
typedef boost::shared_ptr<audio_osx_source> audio_osx_source_sptr;
audio_osx_source_sptr
audio_osx_make_source (int sample_rate = 44100,
const std::string device_name = "",
bool do_block = true,
int channel_config = -1,
int max_sample_count = -1);
/*!
* \brief audio source using OSX
*
* Input signature is one or two streams of floats.
* Samples must be in the range [-1,1].
*/
class audio_osx_source : public gr_sync_block {
friend audio_osx_source_sptr
audio_osx_make_source (int sample_rate,
const std::string device_name,
bool do_block,
int channel_config,
int max_sample_count);
Float64 d_deviceSampleRate, d_outputSampleRate;
int d_channel_config;
UInt32 d_inputBufferSizeFrames, d_inputBufferSizeBytes;
UInt32 d_outputBufferSizeFrames, d_outputBufferSizeBytes;
UInt32 d_deviceBufferSizeFrames, d_deviceBufferSizeBytes;
UInt32 d_leadSizeFrames, d_leadSizeBytes;
UInt32 d_trailSizeFrames, d_trailSizeBytes;
UInt32 d_extraBufferSizeFrames, d_extraBufferSizeBytes;
UInt32 d_queueSampleCount, d_max_sample_count;
UInt32 d_n_AvailableInputFrames, d_n_ActualInputFrames;
UInt32 d_n_user_channels, d_n_max_channels, d_n_deviceChannels;
bool d_do_block, d_passThrough, d_waiting_for_data;
gruel::mutex* d_internal;
gruel::condition_variable* d_cond_data;
circular_buffer<float>** d_buffers;
// AudioUnits and Such
AudioUnit d_InputAU;
AudioBufferList* d_InputBuffer;
AudioBufferList* d_OutputBuffer;
AudioConverterRef d_AudioConverter;
protected:
audio_osx_source (int sample_rate = 44100,
const std::string device_name = "",
bool do_block = true,
int channel_config = -1,
int max_sample_count = -1);
public:
~audio_osx_source ();
bool start ();
bool stop ();
bool IsRunning ();
bool check_topology (int ninputs, int noutputs);
int work (int noutput_items,
gr_vector_const_void_star &input_items,
gr_vector_void_star &output_items);
private:
void SetDefaultInputDeviceAsCurrent ();
void AllocAudioBufferList (AudioBufferList** t_ABL,
UInt32 n_channels,
UInt32 inputBufferSizeBytes);
void FreeAudioBufferList (AudioBufferList** t_ABL);
static OSStatus ConverterCallback (AudioConverterRef inAudioConverter,
UInt32* ioNumberDataPackets,
AudioBufferList* ioData,
AudioStreamPacketDescription** outASPD,
void* inUserData);
static OSStatus AUInputCallback (void *inRefCon,
AudioUnitRenderActionFlags *ioActionFlags,
const AudioTimeStamp *inTimeStamp,
UInt32 inBusNumber,
UInt32 inNumberFrames,
AudioBufferList *ioData);
#if _OSX_DO_LISTENERS_
static OSStatus UnitListener (void *inRefCon,
AudioUnit ci,
AudioUnitPropertyID inID,
AudioUnitScope inScope,
AudioUnitElement inElement);
static OSStatus HardwareListener (AudioHardwarePropertyID inPropertyID,
void *inClientData);
#endif
};
#endif /* INCLUDED_AUDIO_OSX_SOURCE_H */
|