Не удалось воспроизвести звук системы после переключения на iOS 5

Вот как я воспроизвел звуковой эффект в iOS 4:

SystemSoundId beepOnSoundId;

CFURLRef soundUrl = CFBundleCopyResourceURL(
    CFBundleGetMainBundle(), 
    CFSTR("beep"), 
    CFSTR("wav"), 
    NULL
);

// soundUrl logged:
// file://localhost/var/mobile/Applications/ ... beep.wav

AudioServicesCreateSystemSoundID(soundUrl, &beepOnSoundId);

// beepOnSoundId logged: 4097

AudioServicesPlaySystemSound(beepOnSoundId);

Он перестает работать, когда я обновил свое устройство до iOS 5. Я ничего не слышу. Я выписал все переменные, и ни один из них не был равен нулю или 0.

Как изменился API в iOS 5, который разбивает мой звуковой код?

Update

Проблема может быть в том, что во время воспроизведения звука я выполняю AVCaptureSession. iOS 5 как-то не позволяет вам делать это больше. Мне нужно воспроизвести звуковой сигнал, когда я записываю что-то с камеры.

Ответ 1

Этот отчет об ошибке может быть связан с вашим вопросом, если у вас работает AVCaptureSession.

В iOS 5 при использовании вызова AudioServicesPlaySystemSound он будет не работает, когда есть активная AVCaptureSession с аудиоустройством активным.

Ответ 2

Одна из проблем может заключаться в том, что в ios 5 при вызове AudioServicesPlaySystemSound она перестает работать, если активна AVCaptureSession с активным аудиоустройством.

Также проверьте имена импорта в ваших файлах, убедитесь, что импорт audiotoolbox находится во всех ваших контроллерах view. Я также пошел к гиду и получил это для вас:) Я оставлю имя сайта внизу

Шаг 1: Импорт системы AudioToolbox Начните с импорта инфраструктуры Audio Toolbox в ваше приложение, чтобы сделать System Sound Services доступным для вашего кода. Для этого выберите проект "PhoneAppSkin" на панели "Навигатор проектов" в Xcode, затем выберите "PhoneAppSkin" в разделе "TARGETS" и, наконец, выберите вкладку "Построить фазы". После этого ваш экран должен выглядеть примерно так:

enter image description here

Затем нажмите "Связывание с бинарными библиотеками" и нажмите "+", чтобы добавить новую структуру в наши проекты, связывающие фазу.

enter image description here

Наконец, найдите всплывающее окно рамки "AudioToolbox" и нажмите "Добавить".

enter image description here

Затем откройте файл PhoneViewController.h и добавьте строку, необходимую для фактического импорта рамки Audio Toolbox в ваш класс:

#import <UIKit/UIKit.h>
#import <AudioToolbox/AudioToolbox.h>

Теперь функции Audio Toolbox должны работать

Веб-сайт Я получил изображения от: http://mobile.tutsplus.com/tutorials/iphone/ios-sdk_playing-systemsoundid/

Ответ 3

У меня почти такой же код, и он работает для меня в iOS5 с видео и сессиями аудио-мультимедиа. Если у вас есть весь код в функции для воспроизведения звука, проблема может заключаться в том, что объект SystemSoundID освобождается до того, как звук может быть воспроизведен, или проблема может быть связана с URL-адресом. Но я думаю, это первый.

Смотрите, работает следующий код:

Объявление SystemSoundID находится в заголовке объекта, и объект живет достаточно долго, чтобы воспроизводить звук.

    SystemSoundID soundID;

AudioServicesCreateSystemSoundID находится в инициализации объекта.

    AudioServicesCreateSystemSoundID((CFURLRef)[NSURL fileURLWithPath:[[NSBundle mainBundle] 
                                                                   pathForResource: @"sound" ofType:@"wav"]], &soundID);

Затем вы можете использовать AudioServicesPlaySystemSound, где бы вы ни захотели внутри объекта.

    AudioServicesPlaySystemSound(soundID);

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

Ответ 4

В моем конструкторе:

[[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryPlayback error: nil];
UInt32 doSetProperty = 1;
AudioSessionSetProperty (kAudioSessionProperty_OverrideCategoryMixWithOthers, sizeof(doSetProperty), &doSetProperty);
[[AVAudioSession sharedInstance] setActive: YES error: nil];
NSURL* musicFile  = [NSURL fileURLWithPath:[[NSBundle mainBundle]
                                                   pathForResource:@"video-sent"
                                                   ofType:@"caf"]];
self.sentSound = [[AVAudioPlayer alloc] initWithContentsOfURL:musicFile error:nil];
[self.sentSound prepareToPlay];

Функция playSentSound

- (void)playSentSound
{
    DLog(@"PLay Sound %@", self.sentSound);
    [self.sentSound play];
}

а затем в коде, который я просто называю

[self playSentSound];

Ключевыми здесь являются первые 4 строки...; -)