Как избежать ввода пользователя при воспроизведении полной звуковой петли - PullRequest
0 голосов
/ 09 августа 2010

У меня есть некоторые UIImageViews (Животные), и при прикосновении к ним начинает играть определенная звуковая петля. Но если пользователь дважды или больше касается одного и того же просмотра, соответствующая звуковая петля начинается снова и снова с перекрытием. Я хочу, чтобы тронутый звук воспроизводился один раз до конца, а затем пользователь мог запустить в следующий раз. Продолжительность звуковой петли составляет ок. 3 сек. Я попробовал что-то с «sleep (3); но он останавливает прогу перед воспроизведением звука ..

Но если пользователь касается другого вида, два разных звука могут перекрываться.

#pragma mark -

-(void)touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event
{
//Soundfile names in array arrAnimalde
arrAnimalde = [NSArray arrayWithObjects:@"Hund" ,@"Schwein" ,@"Ferkel", nil];

// here are some Views and their triggers
if([touch view] == img_hund){
    trigAnimal = 0;
    }

if([touch view] == img_schwein){
    trigAnimal = 1;
    }

if([touch view] == img_ferkel){
    trigAnimal = 2;
      }

    AudioServicesCreateSystemSoundID ((CFURLRef)[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource: [arrAnimalde objectAtIndex: trigAnimal]
 ofType: @"wav"]], &soundFileObject);
    AudioServicesPlaySystemSound (self.soundFileObject);

//if the trigger is the same as before play the sound only once and completely
      }
}

Пожалуйста, напишите также альтернативные решения - возможно, с возможностью запуска и удержания звука в каждом операторе if.

Thanxx

1 Ответ

1 голос
/ 09 августа 2010

Вы можете позвонить [[UIApplication sharedApplication] beginIgnoringInteractionEvents] до вызова AudioServicesPlaySystemSound. Как только звук закончится, вы можете позвонить [[UIApplication sharedApplication] endIgnoringInteractionEvents], чтобы снова разрешить взаимодействие. Эти вызовы заблокируют взаимодействие для всего в вашем приложении, что означает, что ваш пользователь не может ничего делать, пока воспроизводится ваш звук. Вместо этого рассмотрите возможность блокировки только вашего сообщения -(void)touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event. Вы можете достичь этого, просто проверив логическое значение если ваш звук все еще играет. Чтобы узнать, когда закончился ваш звук, зарегистрируйте соответствующий обратный вызов с помощью этой функции:

OSStatus AudioServicesAddSystemSoundCompletion (
   SystemSoundID                           inSystemSoundID,
   CFRunLoopRef                            inRunLoop,
   CFStringRef                             inRunLoopMode,
   AudioServicesSystemSoundCompletionProc  inCompletionRoutine,
   void                                    *inClientData
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...