系統聲音服務與震動


系統聲音服務(System Sound Services)提供了一個接口,用於播放不超過30秒的聲音。它支持的文件格式有限,具體地說只有CAF、AIF和使用PCM或IMA/ADPCM數據的WAV文件。由於這些函數沒有提供操縱聲音和控制音量的功能,所以當你為多媒體或者游戲創建專門的配樂時,不要使用系統聲音服務。

iOS使用系統聲音服務來支持三種不同的通知:
1. 聲音:立刻播放一個簡單的聲音文件。如果手機被設置為靜音,用戶什么也聽不到
2. 提醒:播放一個聲音文件,如果手機被設置為靜音或震動,將通過震動提醒用戶
3. 震動:震動手機,而不考慮其他設置

要在項目中使用系統聲音服務,首先要導入AudioToolbox.h

#import <AudioToolbox/AudioToolbox.h>

系統聲音服務並非是通過類實現的,而是使用傳統的C語言函數調用來觸發播放操作。要播放音頻,需要使用的兩個函數是AudioServicesCreateSystemSoundID 和 AudioServicesPlaySystemSound。還需要聲明一個類型為SystemSoundID的變量,它表示要使用的聲音文件。下面演示了如何加載並播放聲音:

- (IBAction)testSystemSound:(id)sender 
{
    SystemSoundID soundID;
    NSString *strSoundFile = [[NSBundle mainBundle] pathForResource:@"alertsound" ofType:@"wav"];
    AudioServicesCreateSystemSoundID((__bridge CFURLRef)[NSURL fileURLWithPath:strSoundFile],&soundID);
    AudioServicesPlaySystemSound(soundID);
}

其實這段代碼應該這樣來理解:

在寫這個功能時最主要是兩句代碼:

SystemSoundID soundID;
AudioServicesPlaySystemSound(soundID);

然后考慮如何在中間加代碼使得soundID被賦值:

AudioServicesCreateSystemSoundID((CFURLRef)fileURL,&myID);

第二個參數就是我們建立的SystemSoundID對象,但是這里要傳地址(加&符號)。
第一個參數需要一個CFURLRef類型的url參數,要新建一個NSString來做橋接轉換(bridge),而這個NSString的值,是通過NSBundle來返回音頻文件路徑:

NSString *strSoundFile = [[NSBundle mainBundle] pathForResource:@"alertsound" ofType:@"wav"];

mainBundle -- 總地來說,mainBundle對應於應用程序文件歸檔或者應用程序的封包:一個以“.app”為擴展名並以應用程序名稱為基本名的目錄。
pathForResource方法 -- 通過文件名和后綴名獲取路徑。
這句話調用pathForResource方法,來獲取mainBundle下名為alertsound.wav的音頻文件,然后將路徑值返回。

對於提醒音來說,與系統聲音之間的差別在於,如果手機處於靜音狀態,提醒音將自動觸發震動。提醒音的設置和用法與系統聲音相同,區別在於系統聲音調用AudioServicesPlaySystemSound而提醒音調用AudioServicesPlayAlertSound

震動更容易實現,只需要調用AudioServicesPlaySystemSound,並將常量kSystemSoundID_Vibrate傳遞給它:

AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);

如果視圖震動不支持震動的設備(如iPad2),將靜默失敗。因此將震動代碼留在應用程序中不會有任何害處,而不管目標設備是什么。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM