en

hi, it seems you are using microsoft internet explorer. it doesn't match web standard and causes problems browsing this site. please please please use mozilla firefox or google chrome instead. thank you!

zh

哦哦!您正在使用Internet Explorer 瀏覽器,它與我們的網頁標準並不相容,可能會導致畫面顯示不正常。
請改用 Mozilla Firefox 或者 Google Chrome 才能正常瀏覽本網站,謝謝!

12.20.2010

聲音播放完成之後的事件處理函式

Core Audio 內提供一在目標聲音播放完成之後會自動呼叫自訂函式的指令,其程式碼如下。

AudioServicesAddSystemSoundCompletion(//目標聲音的SystemSoundID
                                      SystemSoundID,

                                      //main run loop
                                      CFRunLoopRef,

                                      //kCFRunLoopDefaultMode
                                      CFStringRef,

                                      //聲音播放完成之後會呼叫的函式
                                      AudioServicesSystemSoundCompletionProc,

                                      //user data
                                      *void);

AudioServicesAddSystemSoundCompletion(soundID,
                                      NULL,
                                      NULL,
                                      afterPlaySound,
                                      NULL);

而被呼叫的函式寫法如下。

static void afterPlaySound (SystemSoundID sound_id, void* user_data) {
    //聲音播放完成時的處理
}

特別注意這裡的函式必須是 Static 型態,因為他只能被內部呼叫,也就是只能被位於相同檔案的函式呼叫。此外,如果我們在此函式中又播放一次相同 System Sound ID 的聲音時,則會進入無窮迴圈。

另外如果要移除 Resources 裡的聲音檔與 System Sound ID 的連結時,可以考慮使用以下指令。

AudioServicesDisposeSystemSoundID(SystemSoundID);
執行此指令之後,原本 System Sound ID 將會呈現 NULL 的情況,也就無法透過 System Sound ID 播放聲音或執行相關指令。






沒有留言:

張貼留言