音频警告可以直接通过“语音”提醒用户。他们生成一个即时反馈,只要用户听力正常即可。幸运的是,苹果公司通过

System Audio 服务将基本的声音播放内置到了 Cocoa Touch SDK 中, 其工作原理与MacnitionSh 上的系统音频非常

类似。

   其它选择包括使用Audio Queue 调用或AVAudioPlayer。 Audio Queue播放对于程序来说代价很高。与简单的警告音需

求相对比较复杂。相反,你只需要几行代码就可以加载和播放系统音频。AVAudioPlayer 也有奇不足之处。它会干扰iPod

音频。相反,System Audio 可以在不影响当前播放音乐的情况下播放音乐。但不可否认的是,结果可能不是你所希望的,

因为音乐可能会掩盖住警告音。

   根据苹果公司的说明,警告音继续较短的时间(30s以下)效果最佳。System Audio 只能播放PCM 和IMA音频。这意味

着声音文件的格式限制在AIFF、WAV和CAF 几种。

  1、系统声音

 要构建系统声音,使用指向声音文件的URL调用 AudioServicesCreateSystemSoundID 。此调用将返回初始化的系统声

音对象,你可以根据需要播放它。只需要使用声音对象调用 AudioServicesPalySystemSound。这一个调用可以完成所有

工作。

AudioServicesPlaySystemSound(mySound);

     默认的系统声音实现可以通过Setting中的sound Effects 首选项控制。当禁用效果时,声音将无法播放。要覆写该首选

项并始终播放声音,可以如下设置属性标志:

AudioServicesCreateSystemSoundID(baseURL,&mysound);
    AudioServicesPropertyID flag=0;
    AudioServicesSetProperty(KAudioServicesPropertyIsUISound, sizeof(SystemSoundID), &mysound, 
   sizeof(AudioServicesPropertyID) , & flag);

 播放iPod 音频时,系统声音一般以同一音量播放,因此用户可能听不到警告。考虑使用震动替代音乐,或

者在播放音乐的同时使用振动效果。可以通过以下测试检查当前的播放状态。确保包含了<MediaPlayer/MediaPlayer.h>

并链接到 MediaPlayer 框架。

if([MPMusicPlayerController   iPodMusicPlayer].playbackState == MPMusicPlaybackStatePlaying)

       通过调用AudioServicesAddSystemSoundCompletion 添加可选的系统声音完成回调,通知你的程序声音已经播放完毕。

如果你不使用一个接一个的短声音,那么一般可以跳过该步骤。

     调用 AudioServicesDisposeSystemSoundID 以及相应的声音可以清除你的声音,该操作可以释放声音对象以及相关的

所有资源。


    2、震动

  与音频声音一样,震动可以立即吸引用户的注意。此外,震动对几乎所有用户都可以使用,包括那些存在视觉和听觉障碍的

人群。使用相同的 System Audio 服务,你可以在播放声音的同时使用震动效果。 所需要的只是下面一行调用。

AudioServicesPlaySystemSound(KSystemSoundID_Vibrate);

  你不能改变震动参数。每个调用都生成一个简短的1-2s 的震动。在不支持震动的平台 (如iPod touch 上,该调用不执行任

何操作,但也不会生成错误。


   3、警告

  Audio Services 提供了震动/ 声音 混合程序,称为警告声音,调用方式如下:

AudioServicesPlayAlertSound(mySound);

  4、延迟

 第一次在iPhone 上播放系统声音时,你可能会遇到延迟。你可以在应用程序初始化时播放一个无声的音频,避免后续

播放时出现延迟。


下面给出 使用 Audio Services 播放声音、警告和震动 的抛砖引玉的 主要 片段代码:

#define COOKBOOK_PURPLE_COLOR [UIColor colorWithRed:0.20392f green:0.19607f blue:0.61176f alpha:1.0f]
 #define BARBUTTON(TITLE, SELECTOR)  [[[UIBarButtonItem alloc] initWithTitle:TITLE style:UIBarButtonItemStylePlain target:self action:SELECTOR] autorelease]- (void) playSound
 {
  if ([MPMusicPlayerController iPodMusicPlayer].playbackState ==  MPMusicPlaybackStatePlaying)
   AudioServicesPlayAlertSound(mysound);
  else
   AudioServicesPlaySystemSound(mysound);
 }- (void) vibrate
 {
  AudioServicesPlaySystemSound (kSystemSoundID_Vibrate);
 }- (void) viewDidLoad
 {
  self.navigationController.navigationBar.tintColor = COOKBOOK_PURPLE_COLOR; // create the sound
  NSString *sndpath = [[NSBundle mainBundle] pathForResource:@"basicsound" ofType:@"wav"];
  CFURLRef baseURL = (CFURLRef)[NSURL fileURLWithPath:sndpath];
  
  // Identify it as not a UI Sound
     AudioServicesCreateSystemSoundID(baseURL, &mysound);
  AudioServicesPropertyID flag = 0;  // 0 means always play
  AudioServicesSetProperty(kAudioServicesPropertyIsUISound, sizeof(SystemSoundID), &mysound, sizeof(AudioServicesPropertyID), &flag);
  
  self.navigationItem.rightBarButtonItem = BARBUTTON(@"Sound", @selector(playSound));
  self.navigationItem.leftBarButtonItem = BARBUTTON(@"Vibrate", @selector(vibrate));
 }-(void) dealloc
 {
     if (mysound) AudioServicesDisposeSystemSoundID(mysound);
     [super dealloc];
 }