2017-02-02 125 views
1

我有一個關於聲音的問題。 我之前在我的項目中使用過像OpenAL這樣的聲音庫。 我需要的是洞察這些庫所使用的下屬OS API。 即使每個庫提供了一種簡單的方法來根據格式來操作輸入文件 ,但必須存在非常基本的「原始字節到字節,發送到驅動程序」函數。C/C++聲音操作系統API

我的意思是,肯定必須有這些庫使用的默認api(一個用於windows,另一個用於Linux) 。我不認爲他們直接使用每個聲卡的驅動程序,所以操作系統必須以某種方式做到這一點。我對麼?我知道DirectX支持聲音(雖然我從來沒有使用它),但是 DirectX並沒有默認安裝在Windows上,所以我想它不會計數, ,我不知道會發生什麼。 Linux,我想知道兩者。

我知道這可能是不切實際的不使用專用庫,我不 真的不打算,但我很好奇這個問題。 所以請放縱我。

因此,對於基本的圖形,它是OpenGL和DirectX ...但聲音呢?

預先感謝您。

+0

對於Linux來說,由於沒有一個單一的聲音API,所以回答有問題。 –

+0

因此,在Linux中,庫如何與所有聲卡驅動程序連接? 而在Windows中,PlaySound是否被所有聲音庫用作基地? –

+0

PlaySound是一個Windows API函數,可以讓您快速輕鬆地播放聲音。這是一種播放聲音的高層次手段,側重於便利而非深度功能。請參閱參考資料:https://msdn.microsoft.com/en-us/library/windows/desktop/dd743680(v=vs.85).aspx –

回答

3

每個主要平臺都有許多API,可以讓您使用聲音。在Windows和Mac上,默認情況下由操作系統以及其他非標準應用程序棄用。

看看他的圖HERE,它對主要平臺上的許多主要聲音API有很好的分解。

除了每個具有本機聲音API的平臺之外,還有許多跨平臺API封裝了每個本地API工作的方式,以允許您編寫便攜式音頻軟件。

例如有:PortAudio這是一個衆所周知的C語言API 還有RtAudio這是聲音的C++ API,但它是有些較舊的C++風格在我看來,(沒有利用職位C++ 11功能)。

我目前正在研究我自己的更現代的C++ 11音頻API,可以找到HERE。目前,我的API是PortAudio的一個小型包裝器,可讓您以更現代的C++方式處理音頻。

請記住,您選擇的圖書館也將取決於您打算做什麼樣的音頻工作。上面列出的所有庫處理實時音頻處理,不處理音頻文件。如果您正在嘗試使用音頻文件,您可以使用libsndfile這是一個流行的開源聲音文件操作API。

從您的問題的上下文來看,它聽起來像您一直主要在遊戲開發相關環境中處理聲音。值得一提的是,在聲音層面上工作,到目前爲止,我所建議的大多數庫都將低於簡單地調用一個函數播放聲音文件的程度。

試圖回答OpenAl如何與操作系統交互的問題是閱讀OpenAL文檔時最好的答案。

我也建議尋找基本的數字音頻理論以及數字信號處理。任何一個主題都有免費的在線資源。

編輯:

在關於如何音頻API的工作......平均音頻API的工作方式關閉編程器和聲卡之間的抽象的幾層。通常,程序員會獲得一個以數組值存儲的音頻數據緩衝區。程序員將要求系統將用於回放的一組特定參數(採樣率,緩衝區大小,通道數量)。程序員將使用音頻數據完成他們的工作,並將輸出緩衝區交給api,後者最終將緩衝區數據交給專爲已安裝聲卡編寫的設備驅動程序。該聲卡的驅動程序將根據驅動程序所指定的平臺指定的接口實現。這就是爲什麼當你在一臺機器上安裝一個新的聲卡時,你可能需要爲它安裝驅動程序,通過安裝驅動程序來爲操作系統級api提供一種與設備通信的手段。

(還有很多更多的那張比,能夠容易地解釋,我敢肯定,我已經失去了在這個過程中的幾個步驟。但是,我希望應該是開始一個足夠好的解釋)

+0

非常感謝你提供這樣一個詳細的答案,這是我所懷疑的。只有一件事,爲什麼(特別是像windows這樣的平臺)有這麼多不同的apis? (WMWE,DirectSound等)? 爲什麼需要這麼多?他們有什麼不同? –

+0

主要答案是,其中一些是傳統的API,這是爲了向後兼容。他們中的一些人像ASIO是第三方,並且旨在儘可能少地處理操作系統,併爲您提供較低級別的功能。其中一些給你不同程度的硬件抽象。我不是Windows聲音的專家,儘管如此,我可能是錯的。我主要處理基於Mac和Linux的系統,幾乎總是使用PortAudio,或者最近使用我上面提到的我自己的API。 –