Playback speed

This commit is contained in:
Pavel Lukandiy 2017-04-14 15:00:20 +03:00
parent a3d8b06975
commit 32d4330195
2 changed files with 39 additions and 0 deletions

View File

@ -239,6 +239,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;

View File

@ -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,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)
{
@ -1866,6 +1877,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(&currentEntryReferencesLock);
@ -2126,6 +2141,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;
@ -2284,6 +2313,7 @@ static BOOL GetHardwareCodecClassDesc(UInt32 formatId, AudioClassDescription* cl
[self createEqUnit];
[self createMixerUnit];
[self createPlaybackSpeedUnit];
[self createOutputUnit];
[self connectGraph];
@ -2332,6 +2362,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)
{