Как направить звук iPhone на гарнитуру Bluetooth - PullRequest
13 голосов
/ 04 марта 2010

Я пытаюсь вывести звук на Bluetooth-гарнитуру (не A2DP), используя AVAudioPlayer, AVAudioSession и AudioSessionSetProperty.

Кажется, есть функции для выбора гарнитуры Bluetooth в качестве входа (kAudioSessionProperty_OverrideCategoryEnableBluetoothInput), но нет эквивалента для настройки выхода. Это делается в приложении «Голосовая почта», где вы можете выбрать гарнитуру, телефонную трубку или динамик телефона. Я пробовал различные комбинации SessionCategories и свойств AudioSession, но я просто не могу найти подход, который работает.

Я уверен, что кто-то понял это, хотите поделиться примером?

Ответы [ 2 ]

16 голосов
/ 29 июля 2010

Этот небольшой тест сработал для меня ... он включает в себя настройку гарнитуры Bluetooth в качестве входа (не уверен, что это то, что вы хотите). Извините за дерьмовое форматирование кода ...

// create and set up the audio session
AVAudioSession* audioSession = [AVAudioSession sharedInstance];
[audioSession setDelegate:self];
[audioSession setCategory: AVAudioSessionCategoryPlayAndRecord error: nil];
[audioSession setActive: YES error: nil];

// set up for bluetooth microphone input
UInt32 allowBluetoothInput = 1;
OSStatus stat = AudioSessionSetProperty (
                         kAudioSessionProperty_OverrideCategoryEnableBluetoothInput,
                         sizeof (allowBluetoothInput),
                         &allowBluetoothInput
                        );
NSLog(@"status = %x", stat);    // problem if this is not zero

// check the audio route
UInt32 size = sizeof(CFStringRef);
CFStringRef route;
OSStatus result = AudioSessionGetProperty(kAudioSessionProperty_AudioRoute, &size, &route);
NSLog(@"route = %@", route);    
// if bluetooth headset connected, should be "HeadsetBT"
// if not connected, will be "ReceiverAndMicrophone"

// now, play a quick sound we put in the bundle (bomb.wav)
CFBundleRef mainBundle = CFBundleGetMainBundle();
CFURLRef        soundFileURLRef;
SystemSoundID   soundFileObject;
soundFileURLRef  = CFBundleCopyResourceURL (mainBundle,CFSTR ("bomb"),CFSTR ("wav"),NULL);
AudioServicesCreateSystemSoundID (soundFileURLRef,&soundFileObject);
AudioServicesPlaySystemSound (soundFileObject);     // should play into headset

Надеюсь, это поможет!

6 голосов
/ 31 марта 2011

Мне удалось заставить это работать, но это заняло некоторое время. Я собрал подходящий кусок кода здесь:

[audioSession setCategory:AVAudioSessionCategoryPlayAndRecord error:&err];

UInt32 allowBluetoothInput = 1;
AudioSessionSetProperty(
    kAudioSessionProperty_OverrideCategoryEnableBluetoothInput,
    sizeof (allowBluetoothInput),
    &allowBluetoothInput);

Также возможно, какие источники доступны и переключаются между Bluetooth, гарнитурой, трубкой или громкой связью, но в этот момент все становится очень сложным. Менеджер аудиоисточников, который я написал, был более 700 строк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...