0

スピーカーから音楽を再生することについていくつか質問があります。次のリンクで例を見つけました 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は「ヘッドフォン」または「スピーカー」であるはずですが、貼り付けたコードが正しく、スピーカーを有効にする方法が正しい場合、まだ作成できません。手伝って頂けますか?

4

2 に答える 2

3

Macbook には 1 セットのスピーカーしかないため、そこからしか聞こえません。電話には、レシーバーのイヤピースとスピーカーの両方が下部にあります (これを使用します)。

設定されているものを確認してくださいkAudioSessionProperty_AudioRoute

アップルは次のように述べています。

kAudioSessionProperty_AudioRoute... 現在のオーディオ ルートの名前 (「ヘッドフォン」、「スピーカー」など)。読み取り専用の CFStringRef 値。

スピーカー プロパティのオーバーライドに関する詳細情報:

このプロパティは、kAudioSessionCategory_PlayAndRecord (または同等の AVAudioSessionCategoryRecord) カテゴリでのみ使用できます。(...) デフォルトでは、このカテゴリの出力オーディオはレシーバー (通話中に耳に当てているスピーカー) に送られます。kAudioSessionOverrideAudioRoute_Speaker 定数を使用すると、出力オーディオを電話の下部にあるスピーカーに向けることができます。

kAudioSessionProperty_OverrideCategoryDe​​faultToSpeaker .. ヘッドセットなどの他のオーディオ ルートが接続されていない場合に、オーディオを (レシーバーではなく) スピーカーにルーティングするかどうかを指定します。デフォルトでは、このプロパティの値は FALSE (0) です。読み取り/書き込みの UInt32 値。

このプロパティは、オーディオ ルートが変更されても (ヘッドセットのプラグを差し込んだり抜いたりした場合など)、中断されてもその値を保持します。オーディオ セッション カテゴリが変更された場合にのみ、デフォルト値に戻ります。このプロパティは、kAudioSessionCategory_PlayAndRecord (または同等の AVAudioSessionCategoryRecord) カテゴリでのみ使用できます。

kAudioSessionProperty_OverrideAudioRoute も参照してください。

于 2010-07-29T14:54:07.173 に答える
1

私は同じ問題を抱えていました。

しかし、最終的にこの方法をオーバーライドすることで修正されました....

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);
}

次に.. (EnableSpeakerPhone) メソッドを逆にするために ( void DisableSpeakerPhone(); ) という新しいメソッドを作成しました

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がメソッドを直接呼び出すようにします...

于 2012-08-26T06:28:06.280 に答える