2015-04-07 4 views
0

Эй У меня есть пара AVAudioPlayers, содержащая по одному звуку. Если я нажимаю одну и ту же кнопку несколько раз, она должна повторять звук с самого начала. Если после этого нажать другую кнопку, то звук будет остановлен, чтобы «сделать комнату» для новой.iOS AVAudioPlayer воспроизводит звук снова

код я использую для этого:

-(void) plays:(int)p{ // p is the index of the sound being triggered 

    if([players[p] isPlaying]) 
     {        // setting the time back to 0 makes 
     players[p].currentTime = 0.0; // the player automatically play again 
     } 
    else 
     { 
     [players[p] play]; // if not playing, start playing 
     } 

    if(last!=p) 
     {      // if the last sound is different from the current 
     [players[last] stop]; // stop the last one 
     players[last].currentTime = 0.0;} // put its position back to 0 

    last=p; // set the 'last' variable 

} 

Однако, попав на ту же кнопку еще раз заканчивается в небольшой задержкой (может быть 20мс), в котором не слышно ни звука. Это время, AVAudioPlayer, кажется, нужно «перемотать» трек, чтобы снова воспроизвести его. Одной идеей обойти это было бы создание нескольких объектов AVAudioPlayer для каждого звука, но это сделало бы какой-то ужасный код! Любые идеи о том, как сделать этот процесс быстрее?

Спасибо, Алекс

EDIT: играть 2 различных звуков отлично работает, я не могу слышать задержку между ними, как я prepareToPlay все звуки заранее.

ответ

1

Я знаю, как устранить разрыв в 20 мс, но сначала подумайте, хотите ли вы этого.

Представьте, что вы сразу же прыгнули из середины звукового файла в начало без пробелов. Еще лучше, загрузите Audacity и услышите, как это звучит. Из-за разрыва вы получите неприятный треск или поп-звук. Возможно, что 1 пятидесятая секунда молчания на самом деле звучит лучше, чем сразу же перезапустить.

Если вы хотите непрерывный аудиопоток, вам придется убрать простой интерфейс AVAudioPlayer и построить AUGraph. Конечно, это означает изучение сложного аудиоинтерфейса и изучение всех аудиоформатов. И тогда вам нужно выяснить, какие данные вы собираетесь использовать в своем аудиопотоке.

Как бы вы сделали свою петлю здоровой? Вы можете попытаться исчезнуть в точке касания, а затем снова затухать. Или вы можете искать нулевые пересечения в начале и конце вашего цикла (пересечение нуля - это место, где значение вашей звуковой волны равно 0. Они случаются все время в моно выход, но может быть труднее найти, если ваш выход стерео.) В конце концов, это будет звучать лучше, чем 20 мс молчания? Выйдите из Audacity и поэкспериментируйте с циклом, прежде чем вы войдете в долгий путь изучения интерфейса AUGraph.

+0

Спасибо за подробный ответ, я буду отмечать за усилия. Похоже, мне нужно читать себя в материалах AUGraph:/Кроме того, благодаря всем этим материалам, связанным с музыкой, но я сам продюсер, и я знаю, что делаю, но, к сожалению, я лучше занимаюсь музыкой, чем я нахожусь в кодировании ха-ха – user2875404

0

К той же песне, как насчет ее остановки, затем подготовиться к игре и играть?

+0

Это занимает как 100 мс, хуже того, что я получил до сих пор – user2875404

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