Как при нажатии кнопки воспроизводить звук ТОЧНО одновременно с активностью экрана

У меня очень конкретная проблема, и я еще не нашел решения. У меня есть IBAction для нажатия кнопки. То, что я хочу сделать, когда эта кнопка нажата, это:

  1. воспроизвести звуковой файл (это звук длиной около 5 секунд)

  2. мигающие слова на экране (это также около 5 секунд)

Я хочу, чтобы это происходило одновременно, поэтому общее время составляет около 5 секунд (слова мигают во время воспроизведения звука).

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

Я пробовал NSThread звук, exec, сброс CATransaction, но ничего не может сделать их одновременными.

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

-(IBAction) playButtonClick:(id)sender {
   int i;

    [_audioPlayer play];

    for (i=0; i<10; i++){
      [self.model getNextWord];   
      [self displayWord];
      [CATransaction flush];
      usleep(550000);   // word on screen for 0.55 seconds
    }

}

[CATransaction flush] требуется, иначе все, что я увижу, будет самым последним словом.


person Baxxter    schedule 28.01.2016    source источник
comment
для загрузки звука требуется некоторое время, убедитесь, что ваш звук находится в памяти, прежде чем кнопка станет активной. Может пригодиться легкий проигрыватель звуковых эффектов, такой как JSQSystemSoundPlayer.   -  person ishaq    schedule 28.01.2016
comment
Вы можете предоставить функцию IBAction?   -  person pkatsourakis    schedule 28.01.2016
comment
Вы предоставите код, в котором вы вызываете обе функции?   -  person CaptainBli    schedule 29.01.2016
comment
usleep? Не держи интерфейс в заложниках. Нить main должна быть свободной. Рассмотрим этот пост: stackoverflow.com/questions/6835472/< /а>   -  person SwiftArchitect    schedule 29.01.2016


Ответы (1)


В вашем распоряжении 2 инструмента:

  • prepareToPlay()
  • playAtTime(_:)

Подготовьтесь так, чтобы звук остался в памяти.

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

Подождите, пока остальная часть вашего пользовательского интерфейса не будет готова, прежде чем играть.

Используйте этот метод для точной синхронизации воспроизведения двух или более объектов AVAudioPlayer.

person SwiftArchitect    schedule 28.01.2016
comment
Спасибо за информацию. Теперь он работает так, как я предполагал. Также спасибо указателю про usleep. Я смог удалить сброс usleep и CATransaction и сделать все правильно! - person Baxxter; 29.01.2016
comment
Я использовал как prepareToPlay, так и playAtTime. - person Baxxter; 29.01.2016