如何将AVAudioPlayer输出到扬声器并验证我是否在iphone模拟器上正确?

时间:2010-07-29 14:12:07

标签: iphone ios-simulator avaudioplayer speaker

我通过扬声器播放音乐时遇到了一些问题。 我在以下链接中找到了一个示例 How to get AVAudioPlayer output to the speaker 但问题是如何确保我通过“扬声器”成功实现了播放音乐? 我把代码编写为链接,但在激活之前和之后似乎没有区别 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 个答案:

答案 0 :(得分:3)

你的macbook只有一套扬声器,所以你只能听到它。手机底部有接收器耳机和扬声器(你想用它)。

只需检查kAudioSessionProperty_AudioRoute设置为的内容。

Apple states:

  

... kAudioSessionProperty_AudioRoute   当前音频路由的名称(例如“耳机”,“扬声器”等)。只读CFStringRef值。

有关覆盖扬声器属性的更多信息:

  

此属性只能与kAudioSessionCategory_PlayAndRecord(或等效的AVAudioSessionCategoryRecord)类别一起使用。 (...)默认情况下,此类别的输出音频将传送到接收器 - 通话时您握在耳边的扬声器。 kAudioSessionOverrideAudioRoute_Speaker常量可让您将输出音频定向到位于手机底部的扬声器。

     

kAudioSessionProperty_OverrideCategoryDe​​faultToSpeaker ..指定在没有连接其他音频路径(如耳机)时是否将音频路由到扬声器(而不是接收器)。默认情况下,此属性的值为FALSE(0)。读/写UInt32值。

     

此属性通过音频路径更改(例如插入或拔出耳机时)和中断时保留其值;只有在音频会话类别更改时,它才会恢复为默认值。此属性只能与kAudioSessionCategory_PlayAndRecord(或等效的AVAudioSessionCategoryRecord)类别一起使用。

     

另见kAudioSessionProperty_OverrideAudioRoute。

答案 1 :(得分: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);
}

然后..我创建了一个名为(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直接调用方法......