2
* Internal interfaces for PortAudio Apple AUHAL implementation
4
* PortAudio Portable Real-Time Audio Library
5
* Latest Version at: http://www.portaudio.com
7
* Written by Bjorn Roche of XO Audio LLC, from PA skeleton code.
8
* Portions copied from code by Dominic Mazzoni (who wrote a HAL implementation)
10
* Dominic's code was based on code by Phil Burk, Darren Gibbs,
11
* Gord Peters, Stephane Letz, and Greg Pfiel.
13
* The following people also deserve acknowledgements:
15
* Olivier Tristan for feedback and testing
16
* Glenn Zelniker and Z-Systems engineering for sponsoring the Blocking I/O
20
* Based on the Open Source API proposed by Ross Bencina
21
* Copyright (c) 1999-2002 Ross Bencina, Phil Burk
23
* Permission is hereby granted, free of charge, to any person obtaining
24
* a copy of this software and associated documentation files
25
* (the "Software"), to deal in the Software without restriction,
26
* including without limitation the rights to use, copy, modify, merge,
27
* publish, distribute, sublicense, and/or sell copies of the Software,
28
* and to permit persons to whom the Software is furnished to do so,
29
* subject to the following conditions:
31
* The above copyright notice and this permission notice shall be
32
* included in all copies or substantial portions of the Software.
34
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
35
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
36
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
37
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR
38
* ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
39
* CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
40
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
44
* The text above constitutes the entire PortAudio license; however,
45
* the PortAudio community also makes the following non-binding requests:
47
* Any person wishing to distribute modifications to the Software is
48
* requested to send the modifications to the original developer so that
49
* they can be incorporated into the canonical version. It is also
50
* requested that these non-binding requests be included along with the
58
@brief AUHAL implementation of PortAudio
61
#ifndef PA_MAC_CORE_INTERNAL_H__
62
#define PA_MAC_CORE_INTERNAL_H__
64
#include <CoreAudio/CoreAudio.h>
65
#include <CoreServices/CoreServices.h>
66
#include <AudioUnit/AudioUnit.h>
67
#include <AudioToolbox/AudioToolbox.h>
69
#include "portaudio.h"
71
#include "pa_hostapi.h"
72
#include "pa_stream.h"
73
#include "pa_allocation.h"
74
#include "pa_cpuload.h"
75
#include "pa_process.h"
76
#include "pa_ringbuffer.h"
78
#include "pa_mac_core_blocking.h"
80
/* function prototypes */
85
#endif /* __cplusplus */
87
PaError PaMacCore_Initialize( PaUtilHostApiRepresentation **hostApi, PaHostApiIndex index );
91
#endif /* __cplusplus */
93
#define RING_BUFFER_ADVANCE_DENOMINATOR (4)
95
PaError ReadStream( PaStream* stream, void *buffer, unsigned long frames );
96
PaError WriteStream( PaStream* stream, const void *buffer, unsigned long frames );
97
signed long GetStreamReadAvailable( PaStream* stream );
98
signed long GetStreamWriteAvailable( PaStream* stream );
99
/* PaMacAUHAL - host api datastructure specific to this implementation */
102
PaUtilHostApiRepresentation inheritedHostApiRep;
103
PaUtilStreamInterface callbackStreamInterface;
104
PaUtilStreamInterface blockingStreamInterface;
106
PaUtilAllocationGroup *allocations;
108
/* implementation specific data goes here */
110
AudioDeviceID *devIds; /*array of all audio devices*/
111
AudioDeviceID defaultIn;
112
AudioDeviceID defaultOut;
118
/* stream data structure specifically for this implementation */
119
typedef struct PaMacCoreStream
121
PaUtilStreamRepresentation streamRepresentation;
122
PaUtilCpuLoadMeasurer cpuLoadMeasurer;
123
PaUtilBufferProcessor bufferProcessor;
125
/* implementation specific data goes here */
126
bool bufferProcessorIsInitialized;
128
AudioUnit outputUnit;
129
AudioDeviceID inputDevice;
130
AudioDeviceID outputDevice;
133
size_t inputFramesPerBuffer;
134
size_t outputFramesPerBuffer;
136
/* We use this ring buffer when input and out devs are different. */
137
PaUtilRingBuffer inputRingBuffer;
138
/* We may need to do SR conversion on input. */
139
AudioConverterRef inputSRConverter;
140
/* We need to preallocate an inputBuffer for reading data. */
141
AudioBufferList inputAudioBufferList;
142
AudioTimeStamp startTime;
143
/* FIXME: instead of volatile, these should be properly memory barriered */
144
volatile PaStreamCallbackFlags xrunFlags;
145
volatile bool isTimeSet;
147
STOPPED = 0, /* playback is completely stopped,
148
and the user has called StopStream(). */
149
CALLBACK_STOPPED = 1, /* callback has requested stop,
150
but user has not yet called StopStream(). */
151
STOPPING = 2, /* The stream is in the process of closing
152
because the user has called StopStream.
153
This state is just used internally;
154
externally it is indistinguishable from
156
ACTIVE = 3 /* The stream is active and running. */
159
//these may be different from the stream sample rate due to SR conversion:
160
double outDeviceSampleRate;
161
double inDeviceSampleRate;
165
#endif /* PA_MAC_CORE_INTERNAL_H__ */