什么是音頻隊(duì)列?
在iOS和Mac OS?X中,音頻隊(duì)列是一個(gè)用來錄制和播放音頻的軟件對(duì)象,他用AudioQueueRef這個(gè)不透明數(shù)據(jù)類型來表示,該類型在AudioQueue.h頭文件中聲明。
音頻隊(duì)列完成以下工作:
連接音頻硬件
內(nèi)存管理
根據(jù)需要為已壓縮的音頻格式引入編碼器
媒體的錄制或播放
你可以將音頻隊(duì)列配合其他Core?Audio的接口使用,再加上相對(duì)少量的自定義代碼就可以在你的應(yīng)用程序中創(chuàng)建一套完整的數(shù)字音頻錄制或播放解決方案。
所有的音頻隊(duì)列都含有相同的基礎(chǔ)結(jié)構(gòu),包含以下幾部分:
一組音頻隊(duì)列緩沖區(qū)(audio queue buffers),每個(gè)音頻隊(duì)列緩沖區(qū)都是一個(gè)存儲(chǔ)音頻數(shù)據(jù)的臨時(shí)倉(cāng)庫(kù)
一個(gè)緩沖區(qū)隊(duì)列(buffer queue),一個(gè)包含音頻隊(duì)列緩沖區(qū)的有序列表
一個(gè)你自己編寫的音頻隊(duì)列回調(diào)函數(shù)(audio queue callback)
??? 它的架構(gòu)很大程度上依賴于這個(gè)音頻隊(duì)列是用來錄制還是用來播放的。不同之處在于音頻隊(duì)列如何連接到它的輸入和輸入,還有它的回調(diào)函數(shù)所扮演的角色。
錄制用音頻隊(duì)列,用AudioQueueNewInput函數(shù)創(chuàng)建,擁有如圖1-1的結(jié)構(gòu)
圖示 1-1? 錄制用音頻隊(duì)列
????錄制用音頻隊(duì)列的輸入端一般連接到外部的音頻硬件上,比如說麥克風(fēng)。在iOS中,音頻來自于由用戶連接的設(shè)備--內(nèi)置的麥克風(fēng)或者耳機(jī)麥克風(fēng),比如說,在Mac OS?X默認(rèn)情況下,音頻來自于由用戶在系統(tǒng)首選項(xiàng)中設(shè)置的系統(tǒng)默認(rèn)音頻輸入設(shè)備。
????錄制用音頻隊(duì)列的輸入端利用了你自己寫的回調(diào)函數(shù),當(dāng)錄制音頻到磁盤上的時(shí)候,回調(diào)函數(shù)將存有從音頻隊(duì)列中接收到的新的音頻數(shù)據(jù)的緩沖區(qū)寫入到音頻文件中。然而,錄制用音頻隊(duì)列也可以用其他方法來使用。你也可以使用其中一種,比如說,在一個(gè)實(shí)時(shí)的分析儀中,在這種情況下,你的回調(diào)函數(shù)會(huì)直接向你的應(yīng)用程序提供音頻數(shù)據(jù),而不是將它寫入磁盤。
??? 你將在“記錄用音頻隊(duì)列回調(diào)函數(shù)”中學(xué)到更多關(guān)于這個(gè)回調(diào)的知識(shí)。
每一個(gè)音頻隊(duì)列——無論是錄制用還是播放用——都有一個(gè)或多個(gè)音頻隊(duì)列緩沖區(qū)。這些緩沖區(qū)排列在一個(gè)特殊的被稱為緩沖區(qū)隊(duì)列(buffer queue)的序列中。如圖所示,音頻隊(duì)列緩沖區(qū)是按照他們被填充的順序編號(hào)的——這也是和把他們交付給回調(diào)函數(shù)的順序是相同的。你將在“緩沖區(qū)隊(duì)列和入隊(duì)”中學(xué)到如何音頻隊(duì)列是如何使用它的緩沖區(qū)的。
播放用音頻隊(duì)列(用AudioQueueNewOutput函數(shù)創(chuàng)建)擁有如圖1-2所示的結(jié)構(gòu)
圖示 1-2? 播放用音頻隊(duì)列
在播放用音頻隊(duì)列中,回調(diào)函數(shù)是在輸入端的,這個(gè)回調(diào)函數(shù)的職責(zé)就是從磁盤(或其他來源)中獲取音頻數(shù)據(jù),然后將它交付給音頻隊(duì)列。當(dāng)沒有更多音頻數(shù)據(jù)需要播放的時(shí)候告訴音頻隊(duì)列停止,你將在“播放用音頻隊(duì)列回調(diào)函數(shù)”中學(xué)到更多關(guān)于這個(gè)回調(diào)函數(shù)的知識(shí)。
播放用音頻隊(duì)列的輸出端一般都是連接到外部的音頻設(shè)備的,比如說揚(yáng)聲器。在iOS中,音頻通過用戶選擇的設(shè)備播放——比如說,接受者是耳機(jī)。在Mac OS?X中,默認(rèn)情況下,音頻會(huì)通過用戶在系統(tǒng)首選項(xiàng)中設(shè)置的默認(rèn)音頻輸出設(shè)備中輸出。
音頻隊(duì)列緩沖區(qū)(audio queue buffer)是一個(gè)AudioQueueBuffer類型的數(shù)據(jù)結(jié)構(gòu),聲明于AudioQueue.h頭文件。
[cpp]view plaincopy
<span?style="font-size:12px;">typedef?struct?AudioQueueBuffer?{??
const?UInt32???mAudioDataBytesCapacity;??
void?*const????mAudioData;</strong>??
????UInt32?????????mAudioDataByteSize;??
void???????????*mUserData;??
}?AudioQueueBuffer;??
typedef?AudioQueueBuffer?*AudioQueueBufferRef;</span>??
??? 上述代碼中高亮的mAudioData域,指向了緩沖區(qū)本身:一個(gè)用來當(dāng)作暫時(shí)存放錄制或播放音頻數(shù)據(jù)的容器的內(nèi)存,其他域中的數(shù)據(jù)用來輔助音頻隊(duì)列管理這個(gè)緩沖區(qū)。
??? 音頻隊(duì)列可以使用任意數(shù)量的緩沖區(qū)。你的應(yīng)用程序制定它的數(shù)量。一般情況下這個(gè)數(shù)字是3。這樣就可以讓給一個(gè)忙于將數(shù)據(jù)寫入磁盤,同時(shí)另一個(gè)在填充新的音頻數(shù)據(jù),第三個(gè)緩沖區(qū)在需要做磁盤I/O延遲補(bǔ)償?shù)臅r(shí)候可用。圖示1-3演示了這個(gè)過程。
音頻隊(duì)列負(fù)責(zé)對(duì)它的緩沖區(qū)進(jìn)行內(nèi)存管理
當(dāng)你調(diào)用AudioQueueAllocateBuffer函數(shù)的時(shí)候音頻隊(duì)列創(chuàng)建了一個(gè)緩沖區(qū)
當(dāng)你通過調(diào)用AudioQueueDispose函數(shù)釋放一個(gè)音頻隊(duì)列的時(shí)候,這個(gè)音頻隊(duì)列釋放掉它擁有的緩沖區(qū)
????這提高了你添加到應(yīng)用程序中的錄制和播放功能的魯棒性。同時(shí)它也幫助你優(yōu)化了資源的使用。
關(guān)于AudioQueueBuffer數(shù)據(jù)結(jié)構(gòu)的完整描述,請(qǐng)參照音頻隊(duì)列服務(wù)參考(Audio Queue Services Reference)
傳遞給音頻隊(duì)列的緩沖區(qū)隊(duì)列,就如它的名字一樣,就是事實(shí)上的音頻隊(duì)列服務(wù)(Audio Queue Services),你見過緩沖區(qū)隊(duì)列——一個(gè)緩沖區(qū)的有序列表——在“音頻隊(duì)列架構(gòu)”中你學(xué)到了音頻隊(duì)列對(duì)象如何配合回調(diào)函數(shù)在錄制或播放的過程中管理緩沖區(qū)隊(duì)列。特別的,你將學(xué)習(xí)到入隊(duì)(enqueuing),緩沖區(qū)隊(duì)列對(duì)音頻隊(duì)列緩沖區(qū)的附加操作。無論你正在實(shí)現(xiàn)錄制或者播放,入隊(duì)都是你在回調(diào)函數(shù)中需要執(zhí)行的任務(wù)。
當(dāng)進(jìn)行錄制的時(shí)候,一個(gè)音頻隊(duì)列緩沖區(qū)被填充了從列入例如麥克風(fēng)的輸入設(shè)備種獲取的音頻數(shù)據(jù)。緩沖區(qū)隊(duì)列中的其他緩沖區(qū)將在當(dāng)前緩沖區(qū)的后面依次排隊(duì)等待被填充音頻數(shù)據(jù)。
音頻隊(duì)列將按照緩沖區(qū)填充的順序把已填充過音頻數(shù)據(jù)的緩沖區(qū)交付給你的回調(diào)函數(shù)。圖示1-3演示了當(dāng)使用音頻隊(duì)列的時(shí)候這個(gè)錄制過程是如何工作的。
圖示 1-3錄制過程
??? 在圖示1-3中的第一步,錄制開始,音頻隊(duì)列用獲取到的數(shù)據(jù)填充緩沖區(qū)。
??? 第二步,第一個(gè)緩沖區(qū)填充完畢,音頻隊(duì)列調(diào)用回調(diào)函數(shù)來處理這個(gè)被填充滿的緩沖區(qū)(緩沖區(qū)一)。回調(diào)函數(shù)(第三步)將緩沖區(qū)的內(nèi)容寫到音頻文件中。同時(shí),音頻隊(duì)列將另一個(gè)緩沖區(qū)(緩沖區(qū)二)填充新獲取到的數(shù)據(jù)。
??? 在第四步,回調(diào)函數(shù)將剛剛寫入磁盤的緩沖區(qū)(緩沖區(qū)一)入隊(duì),使它重新重新回到被填充的隊(duì)列。音頻隊(duì)列再一次調(diào)用回調(diào)函數(shù)(第五步),處理下一個(gè)填充完畢的緩沖區(qū)(緩沖區(qū)二)。回調(diào)函數(shù)(第六步)將這個(gè)緩沖區(qū)的內(nèi)容寫入到音頻文件。這種穩(wěn)定狀態(tài)會(huì)一直持續(xù)到用戶停止錄制。
當(dāng)進(jìn)行播放的時(shí)候,音頻隊(duì)列緩沖區(qū)將被傳送到像揚(yáng)聲器這樣的輸出設(shè)備。緩沖區(qū)隊(duì)列中其他的緩沖區(qū)講按順序排在當(dāng)前緩沖區(qū)后面等待播放。
音頻隊(duì)列將已經(jīng)播放過的音頻數(shù)據(jù)按照他們播放的順序交付給你的回調(diào)函數(shù),回調(diào)函數(shù)將新的音頻數(shù)據(jù)讀取到一個(gè)緩沖區(qū)中,然后將它入隊(duì)。圖示1-4演示了當(dāng)使用音頻隊(duì)列時(shí)播放是如何工作的
圖示 1-4播放過程
圖示1-4中的第一步,應(yīng)用程序啟動(dòng)播放用音頻隊(duì)列,應(yīng)用程序?qū)γ恳粋€(gè)音頻隊(duì)列緩沖區(qū)調(diào)用回調(diào)函數(shù),填充這些緩沖區(qū)并且將它們加入緩沖區(qū)隊(duì)列。啟動(dòng)操作會(huì)確保播放可以立即執(zhí)行當(dāng)你的應(yīng)用程序調(diào)用AudioQueueStart函數(shù)之后。
??? 在第三步,音頻隊(duì)列將第一個(gè)緩沖區(qū)(緩沖區(qū)一)交付給輸出。
??? 當(dāng)?shù)谝粋€(gè)緩沖區(qū)被播放完畢之后,播放用音頻隊(duì)列就進(jìn)入了一個(gè)穩(wěn)定的循環(huán)狀態(tài)。音頻隊(duì)列開始播放下一個(gè)緩沖區(qū)(第四步,緩沖區(qū)二)然后調(diào)用回調(diào)函數(shù)(第五步),處理剛剛播放完的那個(gè)緩沖區(qū)(緩沖區(qū)一)。這個(gè)回調(diào)函數(shù)(第六步)從音頻文件中讀取數(shù)據(jù)填充緩沖區(qū)然后將他們?nèi)腙?duì)用于播放。
音頻隊(duì)列緩沖區(qū)總是按照他們?nèi)腙?duì)的順序進(jìn)行播放,然而,在播放過程中,音頻隊(duì)列服務(wù)為你提供了AudioQueueEnqueueBufferWithParameters函數(shù)來進(jìn)行一些控制,這個(gè)函數(shù)有以下功能:
設(shè)置緩沖區(qū)的精確播放時(shí)間,這可以讓你支持同步
截?cái)嘁纛l隊(duì)列緩沖區(qū)開頭或結(jié)尾的幀(frame),這可以讓你移除開頭或結(jié)尾的靜音
在緩沖區(qū)的粒度上設(shè)置播放增益
??? 關(guān)于更多播放增益的知識(shí),請(qǐng)看"音頻隊(duì)列參數(shù)"(Audio Queue Parameters.),如果要對(duì)Audio Queue Parameters.函數(shù)的完整描述,請(qǐng)參照“音頻隊(duì)列服務(wù)參考”(Audio Queue Parameters.)。
一般來說,使用音頻隊(duì)列服務(wù)的大部分編程任務(wù)都在編程音頻隊(duì)列回調(diào)函數(shù)上。
????在錄制或播放過程中,音頻隊(duì)列將反復(fù)的調(diào)用它所擁有的音頻隊(duì)列回調(diào)函數(shù)。調(diào)用的時(shí)間間隔取決于音頻隊(duì)列緩沖區(qū)的容量,并且一般來一說這個(gè)時(shí)間在半秒或者幾秒。
無論對(duì)于錄制或者播放,音頻隊(duì)列回調(diào)的一個(gè)職責(zé)就是返回一個(gè)緩沖區(qū)隊(duì)列的音頻隊(duì)列緩沖區(qū)。回調(diào)函數(shù)使用AudioQueueEnqueueBuffer函數(shù)將一個(gè)緩沖區(qū)加入到緩沖區(qū)隊(duì)列的末尾。對(duì)于播放來說,你也可以使用AudioQueueEnqueueBufferWithParameters函數(shù)來獲得更多的控制,就像“控制播放過程”中描述的一樣。
本節(jié)介紹了一般情況下——將音頻錄制到磁盤上,這種情況的回調(diào)函數(shù)。這里是這個(gè)錄制用回調(diào)函數(shù)的原型,就和AudioQueue.h頭文件中聲明的一樣:
[cpp]view plaincopy
AudioQueueInputCallback?(??
void???????????????????????????????*inUserData,??
????AudioQueueRef??????????????????????inAQ,??
????AudioQueueBufferRef????????????????inBuffer,??
const?AudioTimeStamp???????????????*inStartTime,??
????UInt32?????????????????????????????inNumberPacketDescriptions,??
const?AudioStreamPacketDescription?*inPacketDescs??
);??
????錄制用音頻隊(duì)列,在調(diào)用回調(diào)函數(shù)的時(shí)候,提供了回調(diào)函數(shù)將下一組音頻數(shù)據(jù)寫入到文件的一切信息。
inUserData,通常是一個(gè)你創(chuàng)建用來保存音頻隊(duì)列和它的緩沖區(qū)狀態(tài)信息的自定義結(jié)構(gòu),一個(gè)音頻文件對(duì)象 (AudioFileID類型)代表你正在寫入的文件,還有這個(gè)文件的音頻格式信息。
inAQ是調(diào)用回調(diào)函數(shù)的音頻隊(duì)列
inBuffer是一個(gè)被音頻隊(duì)列填充新的音頻數(shù)據(jù)的音頻隊(duì)列緩沖區(qū),它包含了回調(diào)函數(shù)寫入文件所需要的新數(shù)據(jù)。.?數(shù)據(jù)已經(jīng)根據(jù)你在自己指定的自定義結(jié)構(gòu)(由inUserData參數(shù)傳入)中指定的格式格式化。關(guān)于此點(diǎn)的更多信息,請(qǐng)參照“使用編碼器和音頻數(shù)據(jù)格式”
inStartTime是緩沖區(qū)中的一采樣的參考時(shí)間,對(duì)于基本的錄制,你的毀掉函數(shù)不會(huì)使用這個(gè)參數(shù)
inNumberPacketDescriptions是inPacketDescs參數(shù)中包描述符(packet descriptions)的數(shù)量,如果你正在錄制一個(gè)VBR(可變比特率(variable bitrate))格式, 音頻隊(duì)列將會(huì)提供這個(gè)參數(shù)給你的回調(diào)函數(shù),這個(gè)參數(shù)可以讓你傳遞給AudioFileWritePackets函數(shù). CBR (常量比特率(constant bitrate))?格式不使用包描述符。對(duì)于CBR錄制,音頻隊(duì)列會(huì)設(shè)置這個(gè)參數(shù)并且將inPacketDescs這個(gè)參數(shù)設(shè)置為NULL
inPacketDescs是一組對(duì)應(yīng)于緩沖區(qū)中采樣的包描述符,音頻隊(duì)列提供了這個(gè)參數(shù)的值,如果音頻文件是VBR格式的,你的回調(diào)函數(shù)可以將這個(gè)值傳遞給AudioFileWritePackets函數(shù)(聲明于AudioFile.h頭文件中)
如果要了解更多關(guān)于錄制用回調(diào)函數(shù)的信息,請(qǐng)參照本文檔的“錄制音頻”,并且參照音頻隊(duì)列服務(wù)參考(Audio Queue Services Reference.)
本節(jié)介紹了一般情況下——從磁盤文件播放音頻,這種情況的回調(diào)函數(shù)。 這里是這個(gè)播放用回調(diào)函數(shù)的原型,就和AudioQueue.h頭文件中聲明的一樣:
[cpp]view plaincopy
AudioQueueOutputCallback?(??
void??????????????????*inUserData,??
????AudioQueueRef?????????inAQ,??
????AudioQueueBufferRef???inBuffer??
);??
播放用音頻隊(duì)列,在調(diào)用回調(diào)函數(shù)的時(shí)候,提供了回調(diào)函數(shù)將下一組音頻數(shù)據(jù)進(jìn)行讀取進(jìn)行播放的信息。
inUserData域,一般來說是一個(gè)你創(chuàng)建的包含音頻隊(duì)列和它的緩沖區(qū)的的狀態(tài)信息的自定義結(jié)構(gòu),一個(gè)音頻文件對(duì)象 (AudioFileID類型)?代表了你要寫入的文件和文件的音頻數(shù)據(jù)格式信息。
在播放音頻隊(duì)列的情況下,回調(diào)函數(shù)會(huì)在這個(gè)結(jié)構(gòu)中用一個(gè)域保持對(duì)當(dāng)前包的索引
inAQ域是調(diào)用這個(gè)回調(diào)函數(shù)的音頻隊(duì)列
inBuffer域是一個(gè)音頻隊(duì)列緩沖區(qū),是一個(gè)有音頻隊(duì)列變成可用狀態(tài)的音頻隊(duì)列緩沖區(qū),你的回調(diào)函數(shù)將把它填充上下一組要進(jìn)行播放的音頻數(shù)據(jù)。
????如果你的應(yīng)用程序在播放VBR數(shù)據(jù),回調(diào)函數(shù)需要得到正在播放的音頻數(shù)據(jù)的包數(shù)據(jù),它通過調(diào)用AudioFileReadPackets函數(shù)來完成這個(gè)任務(wù),這個(gè)函數(shù)聲明于AudioFile.h頭文件,回調(diào)函數(shù)隨后將包信息放到自定義的數(shù)據(jù)結(jié)構(gòu)中以使得它對(duì)播放用音頻隊(duì)列可用。
關(guān)于播放回調(diào)的更多信息,請(qǐng)看本文檔的“播放音頻”(Playing Audio),并且參照音頻隊(duì)列服務(wù)參考(Audio Queue Services Reference.)
音頻隊(duì)列服務(wù)根據(jù)在不同的音頻格式之間轉(zhuǎn)換的時(shí)候會(huì)根據(jù)需要使用編碼器(音頻數(shù)據(jù)編碼/解碼組件)。你的錄制或播放程序可以使用任意已經(jīng)安裝過相應(yīng)編碼器的格式,不需要寫自定義的代碼來處理各種各樣的音頻格式。特別的,你的回調(diào)函數(shù)不需要知道數(shù)據(jù)格式。
現(xiàn)在來講解一下這是如何工作的,每一個(gè)音頻隊(duì)列在AudioStreamBasicDescription結(jié)構(gòu)中都有一個(gè)域代表了音頻數(shù)據(jù)格式。當(dāng)你在mFormatID域中指定了它的格式的時(shí)候——音頻隊(duì)列會(huì)使用相應(yīng)的解碼器。然后你指定采樣率和聲道數(shù),這些就是所有你需要做的。你將會(huì)在“錄制音頻”和“播放音頻”中看到如何設(shè)置音頻數(shù)據(jù)格式的示例。
錄制用音頻隊(duì)列按照?qǐng)D示1-5中的流程使用已安裝的編碼器。
圖示 1-5? 在錄制音頻的時(shí)候進(jìn)行音頻格式轉(zhuǎn)換
??? 在圖示1-5中的第一步,你的應(yīng)用程序告訴音頻隊(duì)列開始錄制,同時(shí)也告訴它所要使用的音頻格式。在第二部,音頻隊(duì)列獲取新的音頻數(shù)據(jù),并且根據(jù)你指定的格式使用相應(yīng)的編碼器轉(zhuǎn)換音頻數(shù)據(jù)。然后音頻隊(duì)列調(diào)用回調(diào)函數(shù),將適當(dāng)?shù)母袷交^的音頻數(shù)據(jù)放進(jìn)緩沖區(qū)中。第三步,回調(diào)函數(shù)將格式化后的音頻數(shù)據(jù)寫入磁盤。再次,你的回調(diào)函數(shù)不需要了解數(shù)據(jù)格式。
播放用音頻隊(duì)列按照?qǐng)D示1-6的流程使用已安裝的編碼器。
圖示 1-6在播放過程中進(jìn)行音頻格式轉(zhuǎn)換
在圖示1-6的第一步中,你的應(yīng)用程序告訴音頻隊(duì)列開始播放,同時(shí)也告訴了它將要播放放的音頻文件的數(shù)據(jù)格式。在第二步,音頻隊(duì)列調(diào)用回調(diào)函數(shù)來從音頻文件中讀取音頻數(shù)據(jù)。回調(diào)函數(shù)按照它的原始格式將音頻數(shù)據(jù)交付給音頻隊(duì)列。在第三步,音頻隊(duì)列使用對(duì)應(yīng)的解碼器將音頻交付給目標(biāo)輸出。
音頻隊(duì)列可以使用任意已安裝的編碼器,無論是Mac OS?X原生的還是第三方的。你可以通過指定音頻隊(duì)列的AudioStreamBasicDescription結(jié)構(gòu)中四字節(jié)的編碼ID來指定將要使用的編碼器。你將會(huì)在“錄制音頻”中看到這個(gè)字段的使用示例。
Mac OS?X包含大量的編碼器,他們都在CoreAudioTypes.h頭文件中的format IDs枚舉值中列出了,并且記錄在核心音頻數(shù)據(jù)類型參考(Core Audio Data Types Reference)中。你可以通過調(diào)用AudioFormat.h頭文件中的接口來查詢當(dāng)前系統(tǒng)可用的編碼器。在Audio Toolbox框架中。你可以使用Fiendishthngs應(yīng)用程序來顯示系統(tǒng)的編碼器,相應(yīng)的示例代碼在網(wǎng)址http://developer.apple.com/samplecode/Fiendishthngs/.
音頻隊(duì)列的生命周期在創(chuàng)建和處理之間。你的應(yīng)用程序管理它的生命周期——并且控制音頻隊(duì)列的狀態(tài)——通過使用AudioQueue.h頭文件中的六個(gè)函數(shù):
Start(AudioQueueStart). 調(diào)用它來初始化錄制或者播放
Prime(AudioQueuePrime).?對(duì)于播放,?在調(diào)用AudioQueueStart之前調(diào)用這個(gè)函數(shù),用來確定音頻隊(duì)列中立刻就有可用的數(shù)據(jù)來播放。這個(gè)函數(shù)不在錄制中使用
Stop(AudioQueueStop).調(diào)用這個(gè)函數(shù)來重置音頻隊(duì)列 (參考下面對(duì)AudioQueueReset的描述),然后停止錄制或播放。一個(gè)播放用音頻隊(duì)列回調(diào)函數(shù)當(dāng)它沒有更多的數(shù)據(jù)播放的時(shí)候會(huì)調(diào)用這個(gè)函數(shù)
Pause(AudioQueuePause).調(diào)用這個(gè)函數(shù)可以在不影響緩沖區(qū)和不重置音頻隊(duì)列的情況下停止錄制或播放。如果需要恢復(fù),調(diào)用AudioQueueStart函數(shù)
Flush(AudioQueueFlush).?在將最后一個(gè)音頻隊(duì)列緩沖區(qū)入隊(duì)之后調(diào)用,來確保所有緩存過的數(shù)據(jù),也包括處理的中間數(shù)據(jù),得到錄制或播放
Reset(AudioQueueReset). 調(diào)用這個(gè)函數(shù)可以立即讓音頻隊(duì)列靜音。移除之前調(diào)度過的緩沖區(qū),并且重置所有解碼器和DSP狀態(tài)
??? 你可以在同步或異步模式下使用AudioQueueStop函數(shù):
同步立刻停止,不考慮之前緩沖的音頻數(shù)據(jù)
異步在所有已入隊(duì)的緩沖區(qū)播放或錄制完畢之后再停止
參照Audio Queue Services Reference來獲取所有這些函數(shù)的完整描述,也包含了更多關(guān)于同步和異步停止音頻隊(duì)列的信息
音頻隊(duì)列參數(shù)(Audio Queue Parameters)
音頻隊(duì)列有一個(gè)稱作參數(shù)(parameters)的可調(diào)整設(shè)置。每個(gè)參數(shù)都有一個(gè)枚舉值作為它的鍵,一個(gè)浮點(diǎn)數(shù)作為它的值。參數(shù)一般于播放,不用于錄制。
在Mac OS?X10.5中,只有一個(gè)音頻隊(duì)列參數(shù)就是播放增益。可以通過使用kAudioQueueParam_Volume常量來獲取或設(shè)置它的值,它的有效范圍在0.0(靜音)到1.0(單位增益)
你的應(yīng)用程序可以通過兩種方法來設(shè)置音頻隊(duì)列參數(shù):
對(duì)于每一個(gè)音頻隊(duì)列,使用AudioQueueSetParameter函數(shù),這可以讓你直接改變音頻隊(duì)列的設(shè)置,這個(gè)改變是立刻生效的
對(duì)于每一個(gè)音頻隊(duì)列緩沖區(qū),調(diào)用AudioQueueEnqueueBufferWithParameters函數(shù)。這可以讓你在將音頻隊(duì)列緩沖區(qū)入隊(duì)的時(shí)候設(shè)置音頻隊(duì)列設(shè)置。這種改變只會(huì)在播放這個(gè)音頻隊(duì)列緩沖區(qū)的時(shí)候生效。
這兩種情況下,音頻隊(duì)列的參數(shù)設(shè)置會(huì)一直保留到你改變它們?yōu)橹埂?/p>
你可以通過調(diào)用AudioQueueGetParameter函數(shù)來獲取音頻隊(duì)列當(dāng)前的參數(shù)。參考Audio Queue Services Reference來獲得這個(gè)函數(shù)的完整描述和獲取和設(shè)置參數(shù)值的方法
轉(zhuǎn)載自:CSDN地址