AUAudioFilePlayer - Используя аудиоустройство проигрывателя аудиофайла
Q: Как я устанавливаю аудиоустройство Проигрывателя Аудиофайла для воспроизведения файла?
A: AUAudioFilePlayer (kAudioUnitSubType_AudioFilePlayer) специализация (подкласс) AUScheduledSoundPlayer это позволяет Вам планировать области аудиофайлов для будущего воспроизведения с демонстрационно-точной синхронизацией.
Как обсуждено в AudioUnitProperties.h, как подкласс запланированного звукового проигрывателя проигрыватель файла наследовал все свои способы поведения. В частности проигрыватель файла реализует kAudioUnitProperty_ScheduleStartTimeStamp и kAudioUnitProperty_CurrentPlayTime свойства, но вместо того, чтобы планировать части (буферы) аудио, которое будет играться (через kAudioUnitProperty_ScheduleAudioSlice), Вы планируете области аудиофайлов, которые будут играться (через kAudioUnitProperty_ScheduledFileRegion). Модуль проигрывателя аудиофайла преобразовывает данные аудиофайла в свои собственные внутренние буферы, выполняющие диск I/O на высокоприоритетном потоке, совместно использованном среди всех экземпляров этого модуля в процессе. После завершения чтения с диска модуль внутренне планирует буферы для воспроизведения.
Начать с AUAudioFilePlayer обеспечьте файл для игры:
AudioFileID mAudioFile; |
... |
UInt32 size; |
err = AudioFileOpenURL(mFileURL, kAudioFileReadPermission, 0, &mAudioFile); |
size = sizeof(mFileDataFormat); |
err = AudioFileGetProperty(mAudioFile, kAudioFilePropertyDataFormat, &size, &mFileDataFormat); |
// it's simplest to set the file player's output format to be |
// canonical float 32, with the file's sample rate and channel count |
err = [self buildAUGraph]; |
... |
// give the file(s) to the player |
// kAudioUnitProperty_ScheduledFileIDs value is an array of AudioFileIDs |
// you must set this property on scheduled file player for all files to be |
// played and must not be set during playback. |
// the audio files must be kept open for the duration of playback |
err = AudioUnitSetProperty(mFilePlayerAU, kAudioUnitProperty_ScheduledFileIDs, |
kAudioUnitScope_Global, 0, &mAudioFile, sizeof(mAudioFile)); |
... |
Для запуска воспроизведения устанавливает область воспроизведения с помощью ScheduledAudioFileRegion структура:
... |
ScheduledAudioFileRegion playRegion; |
playRegion.mTimeStamp.mFlags = kAudioTimeStampSampleTimeValid; |
playRegion.mTimeStamp.mSampleTime = 0; |
playRegion.mCompletionProc = NULL; |
playRegion.mCompletionProcUserData = NULL; |
playRegion.mAudioFile = mAudioFile; |
playRegion.mLoopCount = 0; |
playRegion.mStartFrame = mStartSampleFrame; |
playRegion.mFramesToPlay = UInt32(-1); |
err = AudioUnitSetProperty(mFilePlayerAU, kAudioUnitProperty_ScheduledFileRegion, |
kAudioUnitScope_Global, 0, &playRegion, sizeof(playRegion)); |
... |
Главный после планирования начальных областей файла, которые будут играться и перед стартовым воспроизведением:
... |
UInt32 primeFrames = 0; // use default value (0x10000) |
err = AudioUnitSetProperty(mFilePlayerAU, kAudioUnitProperty_ScheduledFilePrime, |
kAudioUnitScope_Global, 0, &primeFrames, sizeof(primeFrames)); |
... |
Установите время начала для запуска воспроизведения в требуемое время:
... |
// set start time on next render cycle |
AudioTimeStamp startTime; |
startTime.mFlags = kAudioTimeStampSampleTimeValid; |
startTime.mSampleTime = -1; |
err = AudioUnitSetProperty(mFilePlayerAU, kAudioUnitProperty_ScheduleStartTimeStamp, |
kAudioUnitScope_Global, 0, &startTime, sizeof(startTime)); |
... |
Один раз игра, получите позицию игры относительно стартовой точки в выборках с помощью kAudioUnitProperty_CurrentPlayTime свойство:
... |
AudioTimeStamp ts; |
UInt32 size = sizeof(ts); |
err = AudioUnitGetProperty(mFilePlayerAU, kAudioUnitProperty_CurrentPlayTime, |
kAudioUnitScope_Global, 0, &ts, &size); |
Float64 sampleFrame = ts.mSampleTime; |
... |
Для остановки просто вызовите AudioUnitReset:
... |
err = AudioUnitReset(mFilePlayerAU, kAudioUnitScope_Global, 0); |
... |
История версии документа
| Дата | Примечания |
|---|---|
| 20.05.2013 | Новый документ, обсуждающий использование аудиоустройства AUAudioFilePlayer. |