【问题标题】:How to set absolute volume with -[NSSound setVolume:]? Not relative to system volume?如何使用 -[NSSound setVolume:] 设置绝对音量?与系统体积无关?
【发布时间】:2012-09-22 22:28:38
【问题描述】:

我有警报声。我从不希望它“响亮”和令人吃惊,所以我通过 [NSSound setVolume] 将它降低到不响亮的音量。

但似乎音量是相对于当前系统音量设置的。因此,如果我在 max-system-volume 的情况下减少它,我在 low-system-volume 的情况下就听不到它了。

如果我使用:[sound setVolume:0.1];

当系统设置为全音量时,这听起来很棒。但是如果系统音量为1/3就完全听不见了。

基本上我想为声音设置一个最大音量。如果系统音量高于此,它将以我预设的最大音量播放。但是如果系统音量低于这个值,它会根据系统音量降级。

像这样:

系统 = 1
-声音 = .3

系统 = .7
-声音 = .3

系统 = .3
-声音 = .3

系统 = .2
-声音 = .2

这是手动检查系统音量并相应设置我的声音的唯一方法吗?

【问题讨论】:

    标签: objective-c macos cocoa


    【解决方案1】:

    NSSound 的音量对应于您在 QuickTime Player、iTunes 等中看到的音量滑块。它是特定声音的音量,与系统音量分开并(如您所见)从属于系统音量。

    您可以通过查询音频硬件 API 来获取当前系统音量。获取默认声音输出设备,然后获取其音量。然后您可以查看它是否高于或低于您所需的音量。

    (值得注意的是,全局“系统卷”并没有真正的一个。默认输出设备有两个,具体输出设备有任意数量,每个都有自己的卷。“系统卷”一般指默认输出设备的音量。)

    但请注意,系统上的任何其他应用程序都不是这样工作的,因此这种行为对用户来说似乎是不可预测的。预计会出现类似于“当系统音量高于某个级别时,音量滑块不起作用”的错误报告。

    【讨论】:

    • 我不会播放“真实”的音轨,只是提示音,因此很难在我的应用界面中设置音量滑块。我已经收到了许多错误报告,例如“警报声太响了!”所以我将不得不在最高音量时降低它。但这意味着在较低的音量下你根本听不到它,所以我想我必须做这个可变音量的事情。
    • 再想一想,我要做的就是根据系统首选项 > 声音中的系统“警报音量”滑块来确定我的声音。假设我可以访问的值是......
    • @cksubs:您可以在警报声音设备上播放声音,这将自动尊重该设备的音量。如果是警报声音,使用系统声音 API 将自动遵循用户关于警报声音的所有设置。
    • 谢谢。我发现通过 AudioToolbox 框架播放我的声音文件是最好/最简单的选择......它现在尊重警报音量和警报设备。
    【解决方案2】:

    我怀疑是这样(考虑如果用户在播放您的声音时更改系统音量会发生什么)。

    您可能还希望使其可由用户设置。昂贵的耳机通常非常敏感(即响亮);如果刻度是线性的,我怀疑 0.1 响亮。

    【讨论】:

      【解决方案3】:

      不是对我原来的确切问题的答案,而是它的导向:将声音文件播放为尊重用户“警报音量”和警报声音设备的“系统声音”:

      http://iosdeveloperzone.com/2011/05/23/snippet-playing-a-system-sound/

      // Required import... Also need AudioToolbox.framework
      #import <AudioToolbox/AudioToolbox.h>
      
      // ivar 
      SystemSoundID mBeep;
      
      // Create the sound ID
      NSString* path = [[NSBundle mainBundle] 
                           pathForResource:@"Beep" ofType:@"aiff"];
      NSURL* url = [NSURL fileURLWithPath:path];
      AudioServicesCreateSystemSoundID((__bridge CFURLRef)url, &mBeep);
      
      // Play the sound
      AudioServicesPlaySystemSound(mBeep);
      
      // Dispose of the sound
      AudioServicesDisposeSystemSoundID(mBeep);
      

      【讨论】:

        【解决方案4】:

        无法设置系统音量。无论 Objective-c 允许您走多低的级别,您都只能设置相对音量级别。即使使用 coreaudio,您也只能设置相对级别。

        GW

        【讨论】:

          猜你喜欢
          • 2012-01-13
          • 2016-09-29
          • 1970-01-01
          • 1970-01-01
          • 2012-10-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-11-16
          相关资源
          最近更新 更多