Beleg
Beleg

Reputation: 362

In IOS core audio, how do you find the true current play head position of a file player audio unit?

I have a program that uses a file player audio unit to play, pause and stop a audio file. The way I am accomplishing this is by initializing the file player audio unit to play the file at position zero and then when the user presses the pause button, I stop the AUGraph, capture the current position, and then use that position as the start position when the user presses the play button. Everything is working as it should, but every 3 or 4 times I hit pause and then play, the song starts playing a half to a full second BEFORE the point where I hit pause.

I can't figure out why this is happening, do any of you have any thoughts? here is a simplified version of my code.

//initialize AUGraph and File player Audio unit
...
...
...

//Start AUGraph 
...
...
...

// pause playback
- (void) pauseAUGraph {

//first stop the AuGrpah
        result = AUGraphStop (processingGraph);

// get current play head position        
        AudioTimeStamp ts;
        UInt32 size = sizeof(ts);

        result = AudioUnitGetProperty(filePlayerUnit, 
                                      kAudioUnitProperty_CurrentPlayTime, kAudioUnitScope_Global, 0, &ts, 
                                      &size);
        //save our play head position for use later
        //must add it to itself to take care of multiple presses of the pause button
        sampleFrameSavedPosition = sampleFrameSavedPosition + ts.mSampleTime; 


        //this stops the file player unit from playing
        AudioUnitReset(filePlayerUnit, kAudioUnitScope_Global, 0); 
        NSLog (@"AudioUnitReset - stopped file player from playing");

    //all done    
}


// Stop playback

- (void) stopAUGraph {
        // lets set the play head to zero, so that when we restart, we restart at the beginning of the file. 

          sampleFrameSavedPosition = 0;
        //ok now that we saved the current pleayhead position, lets stop the AUGraph
        result = AUGraphStop (processingGraph);
}

Upvotes: 6

Views: 2085

Answers (2)

May be you should use packet counts instead of timestamps, since you just want to pause and play the music, not display the time information.

See BufferedAudioPlayer for an example of using this method.

Upvotes: 2

waylonion
waylonion

Reputation: 6976

It may be due to rounding problems with your code:

For example, if every time you hit the pause button, your timer would record at a 0.5/4 seconds before your actual pause time, you would still see a desired result. But after repeating for four more times, the amount of space you have created is 0.5/4 times 4 which is the half of a second you seem to be experiencing.

Thus, I would pay careful attention to the object types you are using and make sure they don't round inappropriately. Try using a double float for your sample times to try to alleviate that problem!

Hope this is clear and helpful! :)

Upvotes: 0

Related Questions