Инициализация AVAudioPlayer и управление памятью - PullRequest
0 голосов
/ 22 марта 2012

Я пытаюсь что-то выяснить -

Каждый раз, когда я использую AVAudioPlayer, мне нужно инициализировать новый объект AVAudioPlayer.

У меня есть 10 Приговор объектов наи я хочу добавить метод PlaySentence к каждому объекту Sentence, чтобы при нажатии на Sentence приложение воспроизводило звуковой файл.

Мне нужно такое поведение во многих представлениях, поэтому я решил добавить методк объектному классу, чтобы я мог просто вызвать -

[Sentence playSound];

Поскольку AVAudioPlayer в любом случае инициализируется каждый раз, когда я хочу его использовать, я не могу понять, почему это должно быть более дорогой операцией.

Прав ли я / это хороший подход к этой необходимости и почему?

Спасибо

Шани

Ответы [ 2 ]

1 голос
/ 26 марта 2012

Так что, если я вас правильно понимаю, вы хотите, чтобы у вашего объекта Sentence был метод playSound, который устанавливает AVAudioPlayer и воспроизводит звук.

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

Другой способ, которым вы могли бы сделать это, - это установить метод на Sentence для возврата URL файла для воспроизведения, а затем просто иметь один экземпляр AVAudioPlayer в вашем контроллере вида, где вы хотите воспроизвести звуки и установить это каждый раз для правильного файла. Это будет мой личный предложенный способ сделать это.

0 голосов
/ 29 марта 2012

Я думаю, что лучшим решением для вас является использование SimpleAudioEngine из библиотеки Cocos2D.

Он прост в использовании и хорошо интегрируется. Как я знаю, он использует OpenAL и AVAudioPlayer. Он имеет простые интерфейсы для управления фоновой музыкой, эффектами и работает с mp3, wav, m4a и другими форматами и кодеками.

Использовать его очень просто:

//  it's better to preload all effects during app start so they will play immediately when you call "playEffect" method 
[[SimpleAudioEngine sharedEngine] preloadEffect:@"sentence.m4a"];
...
//  play effect where you need it
[[SimpleAudioEngine sharedEngine] playEffect:soundName];

Вы можете найти его здесь внутри библиотеки Cocos2D. И вы можете найти всю полезную информацию об этом здесь .

...