Как получить вывод AVAudioPlayer на динамик и проверить, прав ли я на симуляторе iphone? - PullRequest
0 голосов
/ 29 июля 2010

У меня есть несколько вопросов по воспроизведению музыки через динамик. я нашел пример по следующей ссылке Как получить выход AVAudioPlayer на динамик но вопрос в том, как убедиться, что я успешно реализовал воспроизведение музыки через «динамик»? Я написал код в качестве ссылки, но, кажется, нет никакой разницы до и после активации "динамик" на симуляторе iphone (на macbook) !!

Обновление:

ниже приведен способ активации динамика.

UInt32 sessionCategory = kAudioSessionCategory_PlayAndRecord ;    // 1

AudioSessionSetProperty (
        kAudioSessionProperty_AudioCategory,                        // 2
        sizeof (sessionCategory),                                   // 3
        &sessionCategory                                            // 4
    );

UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker;  // 1

AudioSessionSetProperty (
    kAudioSessionProperty_OverrideAudioRoute,                         // 2
    sizeof (audioRouteOverride),                                      // 3
    &audioRouteOverride                                               // 4
);

ниже - способ отключения динамика

UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_None;  // 1

AudioSessionSetProperty (
    kAudioSessionProperty_OverrideAudioRoute,                         // 2
    sizeof (audioRouteOverride),                                      // 3
    &audioRouteOverride                                               // 4
);

когда я пытался проверить содержимое kAudioSessionProperty_AudioRoute как NSLog (@ "% @", kAudioSessionProperty_AudioRoute); , симулятор разбился.

Я смотрю документацию, CFStringRef почти такой же, как и тип NSString. Поэтому разумно использовать NSLog для вывода значения kAudioSessionProperty_AudioRoute.

Как вы сказали, kAudioSessionProperty_AudioRoute должен быть "наушником" или "динамиком" Я все еще не могу сделать, если код, который я вставляю, является правильным, и способ, которым я активировал спикера, является правильным. Вы можете мне помочь?

Ответы [ 2 ]

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

Ваш macbook имеет только один комплект динамиков, так что вы услышите его только от этого. В телефоне есть как динамик ресивера, так и динамик внизу (который вы хотите использовать).

Просто проверьте, что kAudioSessionProperty_AudioRoute установлено как.

Apple заявляет:

kAudioSessionProperty_AudioRoute ... Название текущего аудио маршрута (например, «Наушники», «Динамик» и т. Д.). Значение CFStringRef только для чтения.

Подробнее о переопределении свойства динамика:

Это свойство может использоваться только с категорией kAudioSessionCategory_PlayAndRecord (или эквивалентной категорией AVAudioSessionCategoryRecord). (...) По умолчанию выходной аудиосигнал для этой категории поступает на ресивер - динамик, который вы подносите к уху при телефонном звонке. Константа kAudioSessionOverrideAudioRoute_Speaker позволяет направлять выводимый звук на динамик, расположенный в нижней части телефона.

kAudioSessionProperty_OverrideCategoryDefaultToSpeaker .. Указывает, следует ли направлять аудио на динамик (а не на ресивер), когда не подключен другой аудио маршрут, такой как гарнитура. По умолчанию это свойство имеет значение FALSE (0). Значение UInt32 для чтения / записи.

Это свойство сохраняет свое значение путем изменения маршрута аудио (например, при подключении или отключении гарнитуры) и при прерывании; он возвращается к своему значению по умолчанию только при изменении категории аудио сеанса. Это свойство может использоваться только с категорией kAudioSessionCategory_PlayAndRecord (или эквивалентной категорией AVAudioSessionCategoryRecord).

См. Также kAudioSessionProperty_OverrideAudioRoute.

1 голос
/ 26 августа 2012

У меня была такая же проблема;

, но, наконец, исправлена ​​путем переопределения таким образом ....

void EnableSpeakerPhone ()
{
UInt32 dataSize = sizeof(CFStringRef);
CFStringRef currentRoute = NULL;
OSStatus result = noErr;

AudioSessionGetProperty(kAudioSessionProperty_AudioRoute, &dataSize, &currentRoute);

// Set the category to use the speakers and microphone.
UInt32 sessionCategory = kAudioSessionCategory_PlayAndRecord;
result = AudioSessionSetProperty (
                                  kAudioSessionProperty_AudioCategory,
                                  sizeof (sessionCategory),
                                  &sessionCategory
                                  );
assert(result == kAudioSessionNoError);

Float64 sampleRate = 44100.0;
dataSize = sizeof(sampleRate);
result = AudioSessionSetProperty (
                                  kAudioSessionProperty_PreferredHardwareSampleRate,
                                  dataSize,
                                  &sampleRate
                                  );
assert(result == kAudioSessionNoError);

// Default to speakerphone if a headset isn't plugged in.
UInt32 route = kAudioSessionOverrideAudioRoute_Speaker;
dataSize = sizeof(route);
result = AudioSessionSetProperty (
                                  // This requires iPhone OS 3.1
                                  kAudioSessionProperty_OverrideCategoryDefaultToSpeaker,
                                  dataSize,
                                  &route
                                  );
assert(result == kAudioSessionNoError);

AudioSessionSetActive(YES);
}

затем .. Я создал новый метод с именем (void DisableSpeakerPhone ();), чтобы полностью изменить (EnableSpeakerPhone) метод

void DisableSpeakerPhone ()
{
UInt32 dataSize = sizeof(CFStringRef);
CFStringRef currentRoute = NULL;
OSStatus result = noErr;

AudioSessionGetProperty(kAudioSessionProperty_AudioRoute, &dataSize, &currentRoute);

// Set the category to use the speakers and microphone.
UInt32 sessionCategory = kAudioSessionCategory_PlayAndRecord;
result = AudioSessionSetProperty (
                                  kAudioSessionProperty_AudioCategory,
                                  sizeof (sessionCategory),
                                  &sessionCategory
                                  );
assert(result == kAudioSessionNoError);

Float64 sampleRate = 44100.0;
dataSize = sizeof(sampleRate);
result = AudioSessionSetProperty (
                                  kAudioSessionProperty_PreferredHardwareSampleRate,
                                  dataSize,
                                  &sampleRate
                                  );
assert(result == kAudioSessionNoError);

// Default to speakerphone if a headset isn't plugged in.
// Overriding the output audio route
// The Trick is here

UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_None;  
dataSize = sizeof(audioRouteOverride);
AudioSessionSetProperty(
                        kAudioSessionProperty_OverrideAudioRoute,
                        dataSize,
                        &audioRouteOverride);

assert(result == kAudioSessionNoError);

AudioSessionSetActive(YES);
}

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

...