Технические вопросы и ответы QA1786

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.