2009-11-15 3 views

ответ

1

Я нашел, если вам не нужны какие-либо продвинутые звуковые функции AVAudioPlayer и NSOperationQueue Работайте очень красиво.

NB: Этот пример адаптированной форме проекта и может содержать некоторые ошибки

//sound1 and sound2 are NSData objects 

NSOperationQueue *queue = [[NSOperationQueue alloc] init]; 
NSError *error = nil; 

AVAudioPlayer *player1 = [[AVAudioPlayer alloc] initWithData:sound1 error:&error]; 
AVAudioPlayer *player2 = [[AVAudioPlayer alloc] initWithData:sound2 error:&error]; 

if(error) 
{ 
    //Handle errors... 
} 

NSInvocationOperation *op1 = [[[NSInvocationOperation alloc] initWithTarget:self selector:@selector(playSounds:) object:player1] autorelease]; 

NSInvocationOperation *op2 = [[[NSInvocationOperation alloc] initWithTarget:self selector:@selector(playSounds:) object:player2] autorelease]; 

[queue addOperation:op1]; 
[queue addOperation:op2]; 

В playSounds методы будут выглядеть следующим образом:

- (void)playSounds:(id)data 
{ 
    AVAudioPlayer *player = (AVAudioPlayer *)data; 

    [player prepareToPlay]; 
    [player play]; 
} 

Обратите внимание на эффективность, это будет отлично работать на симуляторе, но дорогостоящей операцией на устройстве является создание объекта AVAudioPlayer, то есть:

AVAudioPlayer *player1 = [[AVAudioPlayer alloc] initWithData:sound1 error:&error]; 

Поэтому лучше иметь все звуки в один файл и использовать currentTime свойство и play и stop методы, чтобы играть правильную часть звукового файла.

+1

Действительно ли задокументировано быть безопасным для доступа к AVAudioPlayer из другого потока?/me == удивлен – tcurdt

1

here является примером использования AudioUnits. они могут быть немного сложными для ваших требований, но тогда вы никогда не заявляли о своих требованиях.

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