|
6 | 6 | #include <mach/mach_time.h> |
7 | 7 | #include "AudioEngine.h" |
8 | 8 | #include <os/lock.h> |
| 9 | +#include "ABLLinkUtils.h" |
9 | 10 |
|
10 | 11 | #define INVALID_BEAT_TIME DBL_MIN |
11 | 12 | #define INVALID_BPM DBL_MIN |
|
30 | 31 | */ |
31 | 32 | typedef struct { |
32 | 33 | ABLLinkRef ablLink; |
| 34 | + ABLLinkAudioSinkRef ablLinkAudioSink; |
33 | 35 | // Shared between threads. Only write when engine not running. |
34 | 36 | Float64 sampleRate; |
35 | 37 | // Shared between threads. Only write when engine not running. |
@@ -221,6 +223,14 @@ static OSStatus audioCallback( |
221 | 223 | (SInt16*)ioData->mBuffers[0].mData); |
222 | 224 | } |
223 | 225 |
|
| 226 | + ABLLinkCommitCoreAudioBufferWithHostTime( |
| 227 | + linkData->ablLinkAudioSink, |
| 228 | + sessionState, |
| 229 | + hostTimeAtBufferBegin, |
| 230 | + linkData->localEngineData.quantum, |
| 231 | + inNumberFrames, |
| 232 | + ioData); |
| 233 | + |
224 | 234 | return noErr; |
225 | 235 | } |
226 | 236 |
|
@@ -266,6 +276,13 @@ - (ABLLinkRef)linkRef { |
266 | 276 | return _linkData.ablLink; |
267 | 277 | } |
268 | 278 |
|
| 279 | +- (void)updateSinkAudioProperties { |
| 280 | + AudioStreamBasicDescription asbd; |
| 281 | + UInt32 dataSize = sizeof(asbd); |
| 282 | + AudioUnitGetProperty(_ioUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Input, 0, &asbd, &dataSize); |
| 283 | + ABLLinkSetPropertiesFromASBD(_linkData.ablLinkAudioSink, &asbd); |
| 284 | +} |
| 285 | + |
269 | 286 | # pragma mark - Handle AVAudioSession changes |
270 | 287 | - (void)handleRouteChange:(NSNotification *)notification { |
271 | 288 | #pragma unused(notification) |
@@ -306,6 +323,8 @@ static void StreamFormatCallback( |
306 | 323 | [engine start]; |
307 | 324 | } |
308 | 325 | } |
| 326 | + |
| 327 | + [engine updateSinkAudioProperties]; |
309 | 328 | } |
310 | 329 |
|
311 | 330 | # pragma mark - create and delete engine |
@@ -342,6 +361,7 @@ - (void)dealloc { |
342 | 361 | [[NSNotificationCenter defaultCenter] removeObserver:self |
343 | 362 | name:@"AVAudioSessionRouteChangeNotification" |
344 | 363 | object:[AVAudioSession sharedInstance]]; |
| 364 | + ABLLinkAudioSinkDelete(_linkData.ablLinkAudioSink); |
345 | 365 | ABLLinkDelete(_linkData.ablLink); |
346 | 366 | } |
347 | 367 |
|
@@ -379,6 +399,7 @@ - (void)initLinkData:(Float64)bpm { |
379 | 399 | mach_timebase_info(&timeInfo); |
380 | 400 |
|
381 | 401 | _linkData.ablLink = ABLLinkNew(bpm); |
| 402 | + _linkData.ablLinkAudioSink = ABLLinkAudioSinkNew(_linkData.ablLink, "metro", 8192); |
382 | 403 | _linkData.sampleRate = [AVAudioSession sharedInstance].sampleRate; |
383 | 404 | _linkData.secondsToHostTime = (1.0e9 * timeInfo.denom) / (Float64)timeInfo.numer; |
384 | 405 | _linkData.sharedEngineData.outputLatency = |
@@ -458,6 +479,8 @@ - (void)setupAudioEngine { |
458 | 479 | (int)result, |
459 | 480 | (const char *)(&result)); |
460 | 481 |
|
| 482 | + [self updateSinkAudioProperties]; |
| 483 | + |
461 | 484 | // Set Audio Callback |
462 | 485 | AURenderCallbackStruct ioRemoteInput; |
463 | 486 | ioRemoteInput.inputProc = audioCallback; |
|
0 commit comments