Merge pull request #2 from TouchInstinct/feature/seek

Feature/seek
This commit is contained in:
Pavel 2017-05-16 16:43:18 +03:00 committed by GitHub
commit 86a870d0d1
2 changed files with 50 additions and 0 deletions

View File

@ -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;

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,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(&currentEntryReferencesLock);
@ -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)
{