如何用 - [NSSound setVolume:]设置绝对音量?与系统容量无关?

时间:2012-09-22 22:28:39

标签: objective-c macos cocoa

我有一个警报声。我从不希望它是#34;响亮的"并且令人吃惊,所以我通过[NSSound setVolume]将它减少到一个不大声的可听音量。

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

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

当系统设置为全音量时听起来不错。但如果系统音量为1/3,它根本听不见。

基本上我想为声音设置最大音量。如果系统音量高于该音量,它将以我预设的最大音量播放。但是,如果系统容量低于系统容量,则会根据系统容量降低系统容量。

像这样:

系统= 1
 -Sound = .3

系统= .7
 -Sound = .3

系统= .3
 -Sound = .3

系统= .2
 -Sound = .2

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

4 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

NSSound的音量对应于您在QuickTime播放器,iTunes等中看到的音量滑块。它是特定声音的音量,与系统音量相关的和(如您所见)分开。

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

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

请注意,这不是系统上任何其他应用程序的工作方式,因此这种行为对用户来说似乎无法预测。预计错误报告的行为“当系统音量超过一定水平时,音量滑块不起作用”。

答案 2 :(得分:1)

不能回答我原来的确切问题,但它引导的地方:播放声音文件作为“系统声音”,尊重用户的“警报音量”并提醒声音设备:

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

答案 3 :(得分:-1)

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

GW