ALSA 協處理器加速 API¶
Jaroslav Kysela <perex@perex.cz>
概述¶
需要公開音訊硬體,以便加速使用者空間的各種任務,例如取樣率轉換器、壓縮流解碼器等。
這是壓縮 ALSA API 的 API 擴充套件的描述,它能夠處理未繫結到即時操作且允許操作序列化的“任務”。
要求¶
主要要求是
使用者空間的多個任務序列化,以允許在沒有使用者空間干預的情況下進行多個操作
每個操作都有單獨的緩衝區(輸入 + 輸出)
使用 mmap 將緩衝區暴露給使用者空間
在任務完成時向用戶空間發出訊號(標準輪詢機制)
設計¶
引入了新的方向 SND_COMPRESS_ACCEL 來識別直通 API。
API 擴充套件與主壓縮 API 共享裝置列舉和引數處理。所有其他即時流式傳輸 ioctl 都被停用,並引入了一組新的任務相關 ioctl。直通裝置不支援標準讀/寫/mmap I/O 操作。
裝置(“流”)狀態處理減少到 OPEN/SETUP。所有其他狀態在直通模式下均不可用。
資料 I/O 機制使用標準 dma-buf 介面,具有 mmap、標準 I/O、緩衝區共享等所有優點。一個緩衝區用於輸入資料,第二個(單獨的)緩衝區用於輸出資料。每個任務都有單獨的 I/O 緩衝區。
對於緩衝引數,fragments 表示給定裝置分配的任務限制。 fragment_size 限制給定裝置的輸入緩衝區大小。輸出緩衝區大小由驅動程式確定(可能與輸入緩衝區大小不同)。
狀態機¶
直通音訊流狀態機如下所述
+----------+
| |
| OPEN |
| |
+----------+
|
|
| compr_set_params()
|
v
all passthrough task ops +----------+
+------------------------------------| |
| | SETUP |
| |
| +----------+
| |
+------------------------------------------+
直通操作 (ioctls)¶
所有操作都使用 stream->device->lock (mutex) 進行保護。
建立¶
建立一組輸入/輸出緩衝區。輸入緩衝區大小為 fragment_size。分配唯一的 seqno。
硬體驅動程式為輸入和輸出緩衝區分配內部的 ‘struct dma_buf’ (使用 ‘dma_buf_export()’ 函式)。這些緩衝區的匿名檔案描述符被傳遞給使用者空間。
釋放¶
釋放一組輸入/輸出緩衝區。如果任務處於活動狀態,則在之前執行停止操作。如果 seqno 為零,則對所有任務執行操作。
開始¶
啟動(排隊)一個任務。任務啟動有兩種情況 - 任務建立後立即啟動。在這種情況下,origin_seqno 必須為零。第二種情況是重用已完成的任務。 origin_seqno 必須標識要重用的任務。 在這兩種情況下,都會分配一個新的 seqno 值並返回給使用者空間。
前提條件是應用程式用新的源資料填充輸入 dma 緩衝區,並將 input_size 設定為將實際資料大小傳遞給驅動程式。
保留資料處理的順序(首先啟動的作業必須首先完成)。
如果多個任務需要狀態處理(例如,重取樣操作),則使用者空間可以設定 SND_COMPRESS_TFLG_NEW_STREAM 標誌來標記新流資料的開始。 保持為新操作分配的緩衝區,而不是使用開啟/關閉機制,會很有用。
停止¶
停止(出隊)一個任務。如果 seqno 為零,則對所有任務執行操作。
狀態¶
獲取任務狀態(活動、已完成)。此外,驅動程式將設定實際的輸出資料大小(輸出緩衝區中的有效區域)。
致謝¶
Shengjiu Wang <shengjiu.wang@gmail.com>
Takashi Iwai <tiwai@suse.de>
Vinod Koul <vkoul@kernel.org>