大多数无声iOS应用中的音量控制

时间:2012-03-20 18:28:14

标签: ios audio core-audio

之前我曾问过this question,但我觉得我应该开始一个新线程,因为我的另一个帖子已经过时了,可能措辞不好。我想知道将音量控制添加到iOS应用程序的最佳方法是什么,大部分是无声的。一个很好的例子是导航应用程序,只有在接近或错过转弯时才播放音频。在这样的应用程序中,听到不够响亮的转弯提示,用户将希望提示的音量可听,并且自然地使用侧音量控制来根据他们的喜好调整提示。

这里有几个问题。一个是音频当前没有播放,因此用户没有参考它增加了多少。这或多或少都是预期的,但是我更感兴趣的是技术问题。要将侧音量控制链接到您的应用,您必须启动和管理音频会话。我没有找到这种情况的权威参考,因为大多数文档都假设您正在播放或正在启动音频。管理一个主要是静音的应用程序的音频会话似乎是一个边缘情况,但我发现它在我工作的两个主要应用程序需要这样的功能时相当普遍。

在与音频会话管理相关的各种问题中,您必须在移入和移出后台时解决查杀和恢复音频会话的问题。您必须考虑在开始时播放音频的其他应用并停止会话。根据您的应用类型,您可能还有其他更高级的需求,例如自定义覆盖路由到扬声器,自定义静音控件等。如果您有使用此类应用的任何经验,您可以详细说明您如何应对此类挑战并阐述其他问题?

2 个答案:

答案 0 :(得分:0)

一个非常常见的方法是在启动时设置适合应用类型的音频会话类别,无论声音是内在的还是明天都不播放(只要应用的目的和设置是玩这样的。)

添加了:

允许用户在应用程序静音时调整音量的一种方法是为用户提供一些方法让您的应用立即开始(和/或可能停止)播放一些具有典型应用幅度的声音:例如,一些校准音/谈话,您的版权声明,商标叮当声或安全信息。

答案 1 :(得分:0)

我在开发大多数无声的应用程序时看到的主要问题是移入/移出前台并与其他音频很好地配合。为了更好地了解我通常做的事情,我将从最近的项目中给出一些片段。 (这些都是故意不完整的,只是为了说明一点。)为了论证,我们假设我们有一个AudioManager类负责维护音频会话。这个类是我们用来实例化自定义音频播放器的。在这样的课程中我们提出:

@interface MyAudioManager ()
@property (nonatomic, retain) BOOL alwaysMaintainAudioSession;
@property (nonatomic, retain) MyCustomAudioPlayer *player;
@end

@implementation MyAudioManager
@synthesize alwaysMaintainAudioSession;
@synthesize player;

-(void) applicationWillEnterForeground
{
    isInBackground = NO;
    if (NO==[self anyAudioIsPlaying] && self.alwaysMaintainAudioSession) {
        [self activateAudioSession];
    }
}

-(void) activateAudioSession
{
    AudioSessionSetActive(TRUE);
    AudioSessionAddPropertyListener ( kAudioSessionProperty_AudioRouteChange, AudioPropertyListener, self);
}

-(BOOL) anyAudioIsPlaying
{
    return [self otherAudioIsPlaying] || [player isPlaying];
}

-(BOOL) otherAudioIsPlaying
{
    UInt32 yesNo;
    UInt32 propertySize = sizeof(yesNo);
    OSStatus status = AudioSessionGetProperty(kAudioSessionProperty_OtherAudioIsPlaying, &propertySize, &yesNo);
    if (kAudioSessionUnsupportedPropertyError == status) {
        return MPMusicPlaybackStatePlaying == [theiPodMusicPlayer playbackState];
    } else {
        return MPMusicPlaybackStatePlaying == [theiPodMusicPlayer playbackState] || yesNo;
    }
}

管理员允许您设置一个始终保持音量控制链接到应用声音的属性,这意味着我们始终确保会话处于活动状态或其他应用正在播放音频。在任何其他情况下,音量控制恢复为控制振铃器。因此,当进入前台时,我们必须检查任何其他音频播放并有条件地激活音频会话。我们还需要在移动到后台时关闭会话以恢复铃声音量控制。

-(void) applicationDidEnterBackground
{
    if (NO==[self anyAudioIsPlaying]) {
        AudioSessionSetActive(NO);
    }
}

在我的解决方案中,我包含了许多其他代码来处理连接蓝牙音频设备时智能响应,创建自定义播放器的工厂方法,自定义音频压缩等等。然而,主要的想法是处理其他播放音频的应用,同时尝试在前台保持音量控制与应用音量相关联。