From fa7fcfd960237612a3f9fd66b4973dc9a4f4f283 Mon Sep 17 00:00:00 2001 From: Pavel Lukandiy Date: Fri, 14 Apr 2017 15:00:20 +0300 Subject: [PATCH] Playback speed --- StreamingKit/StreamingKit/STKAudioPlayer.h | 3 ++ StreamingKit/StreamingKit/STKAudioPlayer.m | 36 ++++++++++++++++++++++ 2 files changed, 39 insertions(+) diff --git a/StreamingKit/StreamingKit/STKAudioPlayer.h b/StreamingKit/StreamingKit/STKAudioPlayer.h index aa69469..36cfec9 100644 --- a/StreamingKit/StreamingKit/STKAudioPlayer.h +++ b/StreamingKit/StreamingKit/STKAudioPlayer.h @@ -247,6 +247,9 @@ typedef void(^STKFrameFilter)(UInt32 channelsPerFrame, UInt32 bytesPerFrame, UIn /// Disposes the STKAudioPlayer and frees up all resources before returning -(void) dispose; +// +-(void)setPlaybackSpeed:(double)speed; + /// The QueueItemId of the currently playing item -(NSObject*) currentlyPlayingQueueItemId; diff --git a/StreamingKit/StreamingKit/STKAudioPlayer.m b/StreamingKit/StreamingKit/STKAudioPlayer.m index 4ab5437..2225c05 100755 --- a/StreamingKit/StreamingKit/STKAudioPlayer.m +++ b/StreamingKit/StreamingKit/STKAudioPlayer.m @@ -203,6 +203,7 @@ static UInt32 maxFramesPerSlice = 4096; static AudioComponentDescription mixerDescription; static AudioComponentDescription nbandUnitDescription; static AudioComponentDescription outputUnitDescription; +static AudioComponentDescription playbackSpeedUnitDescription; static AudioComponentDescription convertUnitDescription; static AudioStreamBasicDescription canonicalAudioStreamBasicDescription; static AudioStreamBasicDescription recordAudioStreamBasicDescription; @@ -230,6 +231,7 @@ static AudioStreamBasicDescription recordAudioStreamBasicDescription; AUNode eqNode; AUNode mixerNode; AUNode outputNode; + AUNode playbackSpeedNode; AUNode eqInputNode; AUNode eqOutputNode; @@ -239,6 +241,7 @@ static AudioStreamBasicDescription recordAudioStreamBasicDescription; AudioComponentInstance eqUnit; AudioComponentInstance mixerUnit; AudioComponentInstance outputUnit; + AudioComponentInstance playbackSpeedUnit; UInt32 eqBandCount; int32_t waitingForDataAfterSeekFrameCount; @@ -371,6 +374,14 @@ static void AudioFileStreamPacketsProc(void* clientData, UInt32 numberBytes, UIn .componentFlagsMask = 0, .componentManufacturer = kAudioUnitManufacturer_Apple }; + + playbackSpeedUnitDescription = (AudioComponentDescription) { + .componentType = kAudioUnitType_FormatConverter, + .componentSubType = kAudioUnitSubType_AUiPodTimeOther, + .componentFlags = 0, + .componentFlagsMask = 0, + .componentManufacturer = kAudioUnitManufacturer_Apple + }; mixerDescription = (AudioComponentDescription) { @@ -1913,6 +1924,10 @@ static void AudioFileStreamPacketsProc(void* clientData, UInt32 numberBytes, UIn [self stopThread]; } +- (void)setPlaybackSpeed:(double)speed { + AudioUnitSetParameter(playbackSpeedUnit, kNewTimePitchParam_Rate, kAudioUnitScope_Global, 0, speed, 0); +} + -(NSObject*) currentlyPlayingQueueItemId { OSSpinLockLock(¤tEntryReferencesLock); @@ -2171,6 +2186,20 @@ static BOOL GetHardwareCodecClassDesc(UInt32 formatId, AudioClassDescription* cl CHECK_STATUS_AND_RETURN(AudioUnitSetProperty(outputUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Input, kOutputBus, &canonicalAudioStreamBasicDescription, sizeof(canonicalAudioStreamBasicDescription))); } +- (void)createPlaybackSpeedUnit { + OSStatus status; + + CHECK_STATUS_AND_RETURN(AUGraphAddNode(audioGraph, &playbackSpeedUnitDescription, &playbackSpeedNode)); + CHECK_STATUS_AND_RETURN(AUGraphNodeInfo(audioGraph, playbackSpeedNode, &playbackSpeedUnitDescription, &playbackSpeedUnit)); + + CHECK_STATUS_AND_RETURN(AudioUnitSetProperty(playbackSpeedUnit, kAudioUnitProperty_MaximumFramesPerSlice, kAudioUnitScope_Global, kOutputBus, &maxFramesPerSlice, sizeof(maxFramesPerSlice))); +#if TARGET_OS_IPHONE + CHECK_STATUS_AND_RETURN(AudioUnitSetParameter(playbackSpeedUnit, kNewTimePitchParam_Rate, kAudioUnitScope_Global, 0, 1, 0)); +#endif + + CHECK_STATUS_AND_RETURN(AudioUnitSetProperty(playbackSpeedUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Input, kOutputBus, &canonicalAudioStreamBasicDescription, sizeof(canonicalAudioStreamBasicDescription))); +} + -(void) createMixerUnit { OSStatus status; @@ -2329,6 +2358,7 @@ static BOOL GetHardwareCodecClassDesc(UInt32 formatId, AudioClassDescription* cl [self createEqUnit]; [self createMixerUnit]; + [self createPlaybackSpeedUnit]; [self createOutputUnit]; [self connectGraph]; @@ -2377,6 +2407,12 @@ static BOOL GetHardwareCodecClassDesc(UInt32 formatId, AudioClassDescription* cl [nodes addObject:@(mixerNode)]; [units addObject:[NSValue valueWithPointer:mixerUnit]]; } + + if (playbackSpeedNode) + { + [nodes addObject:@(playbackSpeedNode)]; + [units addObject:[NSValue valueWithPointer:playbackSpeedUnit]]; + } if (outputNode) {