diff --git a/StreamingKit/StreamingKit/STKAudioPlayer.h b/StreamingKit/StreamingKit/STKAudioPlayer.h index 0ce6d53..792ba6e 100644 --- a/StreamingKit/StreamingKit/STKAudioPlayer.h +++ b/StreamingKit/StreamingKit/STKAudioPlayer.h @@ -239,6 +239,12 @@ typedef void(^STKFrameFilter)(UInt32 channelsPerFrame, UInt32 bytesPerFrame, UIn /// Disposes the STKAudioPlayer and frees up all resources before returning -(void) dispose; +/// Sets playback speed +-(void)setPlaybackSpeed:(double)speed; + +/// Sets playback speed to 1.0 +-(void)setDefaultPlaybackSpeed; + /// The QueueItemId of the currently playing item -(NSObject*) currentlyPlayingQueueItemId; diff --git a/StreamingKit/StreamingKit/STKAudioPlayer.m b/StreamingKit/StreamingKit/STKAudioPlayer.m index c97ec36..ae115dd 100755 --- a/StreamingKit/StreamingKit/STKAudioPlayer.m +++ b/StreamingKit/StreamingKit/STKAudioPlayer.m @@ -174,6 +174,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; @@ -201,6 +202,7 @@ static AudioStreamBasicDescription recordAudioStreamBasicDescription; AUNode eqNode; AUNode mixerNode; AUNode outputNode; + AUNode playbackSpeedNode; AUNode eqInputNode; AUNode eqOutputNode; @@ -210,6 +212,7 @@ static AudioStreamBasicDescription recordAudioStreamBasicDescription; AudioComponentInstance eqUnit; AudioComponentInstance mixerUnit; AudioComponentInstance outputUnit; + AudioComponentInstance playbackSpeedUnit; UInt32 eqBandCount; int32_t waitingForDataAfterSeekFrameCount; @@ -339,6 +342,15 @@ 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) { @@ -1866,6 +1878,16 @@ static void AudioFileStreamPacketsProc(void* clientData, UInt32 numberBytes, UIn [self stopThread]; } +-(void)setPlaybackSpeed:(double)speed +{ + AudioUnitSetParameter(playbackSpeedUnit, kNewTimePitchParam_Rate, kAudioUnitScope_Global, 0, speed, 0); +} + +-(void)setDefaultPlaybackSpeed +{ + [self setPlaybackSpeed:1.f]; +} + -(NSObject*) currentlyPlayingQueueItemId { OSSpinLockLock(¤tEntryReferencesLock); @@ -2126,6 +2148,21 @@ 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; @@ -2284,6 +2321,7 @@ static BOOL GetHardwareCodecClassDesc(UInt32 formatId, AudioClassDescription* cl [self createEqUnit]; [self createMixerUnit]; + [self createPlaybackSpeedUnit]; [self createOutputUnit]; [self connectGraph]; @@ -2332,6 +2370,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) {