2012-08-02 6 views
2

Я пытаюсь воспроизвести звук при нажатии кнопки, и я использую аудиоустройство iX 5 для проигрывателя файлов.Установить ScheduledAudioFileRegion, чтобы начать заново

Файл проигрыватель воспроизводит звук с помощью ScheduledAudioFileRegion и могут быть запланированы, чтобы играть столько кадров, сколько нужно

ScheduledAudioFileRegion rgn; 
memset (&rgn.mTimeStamp, 0, sizeof(rgn.mTimeStamp)); 
rgn.mTimeStamp.mFlags = kAudioTimeStampSampleTimeValid; 
rgn.mTimeStamp.mSampleTime = 0; 
rgn.mCompletionProc = NULL; 
rgn.mCompletionProcUserData = NULL; 
rgn.mAudioFile = audioFile; 
rgn.mLoopCount = INT_MAX; 
rgn.mStartFrame = 0; 
rgn.mFramesToPlay = nPackets * fileASBD.mFramesPerPacket; // plays entire file. 

Как я могу сказать, этот файл плеер для воспроизведения звука с самого начала, когда кнопка нажата, или мне нужно создавать новый регион и каждый раз менять его? Я хочу, чтобы звук воспроизводился, когда кнопка нажата от начала до конца, но когда кнопка снова нажата, она должна начинаться с начала, даже если файл в данный момент воспроизводится. Возможно ли это с аудиоустройством файлового проигрывателя?

+0

Вам не нужно использовать 'INT_MAX' для получения неопределенного цикла, установка' mLoopCount' в '-1' приведет к тому, что область будет работать бесконечно. –

+0

В этом случае вы * только * хотите, чтобы звуковой файл воспроизводился при нажатии кнопки или вы хотите сделать больше, чем, например, триггер накладывать звуковые файлы, добавлять эффекты и т. д.? Если это просто простой триггер, было бы гораздо проще использовать «AudioServicesPlaySystemSound», как описано [здесь] (http://stackoverflow.com/a/2778996/172218). AudioUnits являются излишними для запуска простого звукового файла. –

+0

Я использую звуковые модули с основным звуком, чтобы захватывать звуки и создавать аграфы с помощью подграфов. Мне нужно захватить эти запущенные звуки в основном миксе. – jarryd

ответ

1

Можете ли вы не просто активировать триггер UIButton перед действием вызова?

+1

Остановить действие, если я могу спросить? Мне нужна максимальная отзывчивость без перенаправления кода через структуру более высокого уровня. Я использую основной звук, для чего мне нужен ответ Тима. – jarryd

3

Позвоните по телефону AudioUnitReset, чтобы остановить воспроизведение, затем нажмите и снова воспроизведите. Случается мгновенно (или так близко, как нет никакой разницы.)

Делайте это каждый раз, когда ваш пользователь нажимает на кнопку:

// Reset 
AudioUnitReset(filePlayerUnit, kAudioUnitScope_Global, 0); 
// Prime (have to do this before every play call.) 
UInt32 defaultVal = 0; 
AudioUnitSetProperty(filePlayerUnit, 
        kAudioUnitProperty_ScheduledFilePrime,     
        kAudioUnitScope_Global, 
        0, 
        &defaultVal, 
        sizeof(defaultVal)); 
// Play (again) 
AudioUnitSetProperty(_playerUnit, 
        kAudioUnitProperty_ScheduleStartTimeStamp, 
        kAudioUnitScope_Global, 
        0, 
        &startTime, 
        sizeof(startTime)); 

у вас уже есть временные метки в регионе. Вы нужны те, но вы также должны создать AudioTimeStamp:

AudioTimeStamp startTime; 
memset(&startTime, 0, sizeof(startTime)); 
startTime.mFlags = kAudioTimeStampSampleTimeValid; 
startTime.mSampleTime = -1; 

Создаст и вызвать связанный SetProperty из первого фрагмента кода выше, перед вызовом играть в первый раз.

+0

Спасибо, Тим, посмотрим на это. – jarryd

+0

Мне пришлось установить регион, чтобы снова играть! – Renetik

Смежные вопросы