axfer-transfer - bộ truyền khung dữ liệu âm thanh cho các thiết bị và nút âm thanh.
axfer transfer direction [ common-options ] [ backend-options ] [ filepath ]
axfer transfer direction [ common-options ] [ backend-options ] -I | --separate-channels filepath ...
direction = capture | playback
common-options = ( read OPTIONS section )
backend-options = ( read OPTIONS section )
filepaths = ( read OPTIONS section )
Lệnh phụ transfer của axfer thực hiện truyền khung dữ liệu âm thanh cho các thiết bị có sẵn trong các chương trình phụ trợ được hỗ trợ. Chương trình này về cơ bản được thiết kế để sử dụng API alsa-lib (phụ trợ libasound) để xử lý các thiết bị âm thanh được hệ thống phụ âm thanh Linux (ALSA) hỗ trợ.
Hoạt động để chụp truyền.
Hoạt động để truyền phát lại.
Filepath được xử lý như một đường dẫn liên quan đến thư mục làm việc hiện tại của thời gian chạy nếu nó không phải là đường dẫn đầy đủ từ thư mục gốc.
Đầu vào hoặc đầu ra tiêu chuẩn được sử dụng nếu đường dẫn tệp không được chỉ định hoặc được cung cấp dưới dạng '-' .
Để truyền phát lại, định dạng vùng chứa của đường dẫn tệp nhất định được phát hiện tự động và siêu dữ liệu được sử dụng cho các tham số về định dạng mẫu, kênh, tốc độ, thời lượng. Nếu không phát hiện thấy gì, nội dung của đường dẫn tệp đã cho sẽ được xử lý dưới dạng dữ liệu thô. Trong trường hợp này, các tham số nên được chỉ định dưới dạng tùy chọn.
Nhiều filepath được cho phép với -I | tùy chọn --kênh riêng. Trong trường hợp này, đầu vào và đầu ra tiêu chuẩn không khả dụng. filepath tương tự không được phép ngoại trừ các đường dẫn được liệt kê bên dưới: - /dev/null - /dev/zero - /dev/full - /dev/random - /dev/urandom
In thông báo trợ giúp và kết thúc thời gian chạy.
Chế độ yên lặng. Chặn tin nhắn (không có âm thanh :))
Chế độ dài dòng. Thời gian chạy kết xuất thông tin bổ sung theo số lượng tùy chọn này được cung cấp trong dòng lệnh.
Ngắt sau # giây. Giá trị bằng không có nghĩa là vô cùng. Giá trị mặc định là 0, vì vậy nếu tùy chọn này bị bỏ qua thì quá trình truyền sẽ chạy cho đến khi nó bị tắt. Tùy chọn -d hoặc -s chỉ khả dụng.
Ngắt sau khi truyền # số khung dữ liệu. Giá trị bằng không có nghĩa là vô cùng. Giá trị mặc định là 0, vì vậy nếu tùy chọn này bị bỏ qua thì quá trình truyền sẽ chạy cho đến khi nó bị tắt. Tùy chọn -d hoặc -s chỉ khả dụng.
Cho biết định dạng của mẫu âm thanh. Điều này là cần thiết để truyền chụp hoặc truyền phát lại với các tệp bao gồm dữ liệu âm thanh thô.
Định dạng mẫu có sẵn được liệt kê bên dưới: - [S8|U8|S16|U16|S32|U32][_LE|_BE] - [S24|U24][_LE|_BE] - FLOAT[_LE|_BE] - FLOAT64[_LE|_BE ] - IEC958_SUBFRAME[_LE|_BE] - MU_LAW - A_LAW - [S20|U20][_LE|_BE] - [S24|U24][_3LE|_3BE] - [S20|U20][_3LE|_3BE] - [S18|U18 ][_3LE|_3BE] - DSD_U8 - DSD_[U16|U32][_LE|_BE]
Nếu endian-ness bị bỏ qua, host endian-ness được sử dụng.
Một số định dạng đặc biệt có sẵn: - cd (16 bit little endian, 44100, stereo) [= -f S16_LE -c 2 -r 44100] - cdr (16 bit big endian, 44100, stereo) [= -f S16_BE -c 2 -f 44100] - dat (16 bit little endian, 48000, stereo) [= -f S16_LE -c 2 -r 48000]
Nếu bị bỏ qua, U8 được sử dụng làm mặc định. Các định dạng khả dụng thực tế bị hạn chế bởi mỗi phụ trợ truyền dẫn.
Định dạng mẫu không có sẵn được liệt kê bên dưới. Các định dạng này có kích thước của khung dữ liệu chưa được phân bổ theo đơn vị byte.
- IMA_ADPCM - MPEG - GSM - ĐẶC BIỆT - G723_24 - G723_24_1B - G723_40 - G723_40_1B
Cho biết số lượng mẫu dữ liệu âm thanh trên mỗi khung hình. Điều này là cần thiết để truyền chụp hoặc truyền phát lại với các tệp bao gồm dữ liệu âm thanh thô. Giá trị phải nằm trong khoảng từ 1 đến 256 . Nếu bị bỏ qua, 1 được sử dụng làm giá trị mặc định.
Cho biết số lượng khung dữ liệu âm thanh mỗi giây. Điều này là cần thiết để truyền chụp hoặc truyền phát lại với các tệp bao gồm dữ liệu âm thanh thô. Nếu giá trị nhỏ hơn 1000 , giá trị đó được diễn giải bằng đơn vị kHz. Giá trị phải nằm trong khoảng từ 2000 đến 192000 . Nếu bị bỏ qua, 8000 được sử dụng làm giá trị mặc định.
Cho biết loại tập tin. Điều này là cần thiết để chụp truyền. Các loại có sẵn được liệt kê bên dưới: - wav: Định dạng RIFF/Wave của Microsoft/IBM - au, sparc: Sparc định dạng AU - voc: Creative Tech. định dạng giọng nói - raw: dữ liệu thô
Khi không có gì được chỉ định, để truyền ảnh chụp, loại được quyết định theo hậu tố của filepath và loại raw được sử dụng cho dự phòng.
Cho biết tùy chọn này khi một số tệp sẽ được xử lý. Để truyền chụp, nếu một đường dẫn tệp được cung cấp dưới dạng đường dẫn tệp , thì một danh sách đường dẫn tệp được tạo theo công thức '<đường dẫn tệp>-[.suffix]'. Hậu tố được bỏ qua khi định dạng thô của vùng chứa được sử dụng.
Kết xuất các tham số phần cứng và kết thúc thời gian chạy nếu chương trình phụ trợ hỗ trợ.
Chọn phần phụ trợ của quá trình truyền từ danh sách bên dưới. Mặc định là libasound.
- libasound - libffado (tùy chọn nếu được biên dịch)
Tùy chọn này được sử dụng để chọn nút PCM trong không gian cấu hình libasound. Các nút khả dụng được liệt kê theo thao tác pcm của lệnh con list.
Với tùy chọn này, luồng con PCM được mở ở chế độ không chặn. Khi khung dữ liệu âm thanh không có sẵn trong bộ đệm của luồng phụ PCM, thao tác I/O sẽ ngay lập tức quay trở lại mà không có quá trình chặn. Tùy chọn này cũng ngầm sử dụng tùy chọn --waiter-type để tránh tiêu tốn quá nhiều thời gian của CPU.
Với tùy chọn này, khung dữ liệu âm thanh được xử lý trực tiếp trong bộ đệm của luồng con PCM nếu nút được chọn hỗ trợ thao tác này. Nếu không có tùy chọn này, bộ đệm tạm thời được sử dụng để sao chép khung dữ liệu âm thanh cho bộ đệm của luồng con PCM. Tùy chọn này cũng ngầm sử dụng tùy chọn --waiter-type để tránh tiêu tốn quá nhiều thời gian của CPU.
Tùy chọn này định cấu hình giá trị đã cho cho tham số phần cứng period_size của luồng phụ PCM. Tham số cho biết số lượng khung dữ liệu âm thanh trên mỗi khoảng thời gian trong bộ đệm của luồng con PCM. Con số thực tế được quyết định là kết quả của sự tương tác giữa mỗi lần triển khai phần bổ trợ PCM được xâu chuỗi từ nút PCM đã chọn và trình điều khiển trong nhân hoặc phần bổ trợ PCM I/O.
Lý tưởng nhất là cùng một lượng khung dữ liệu âm thanh với giá trị phải được xử lý trong một thao tác I/O. Trên thực tế, không phải vậy, tùy thuộc vào việc triển khai các phần bổ trợ PCM, trình điều khiển trong nhân, phần bổ trợ PCM I/O và mô hình lập lịch trình. Đối với plugin 'hw' PCM trong mô hình lập lịch trình 'irq', giá trị được sử dụng để quyết định khoảng thời gian gián đoạn phần cứng, do đó, cùng một lượng khung dữ liệu âm thanh như giá trị dự kiến sẽ khả dụng cho một thao tác I/O.
Tùy chọn này định cấu hình giá trị đã cho cho tham số phần cứng period_time của luồng phụ PCM. Tùy chọn này tương tự như tùy chọn --period-size, tuy nhiên, đơn vị của nó là micro giây.
Tùy chọn này định cấu hình giá trị đã cho cho tham số phần cứng buffer_size của luồng phụ PCM. Tham số cho biết số lượng khung dữ liệu âm thanh trong bộ đệm của luồng con PCM. Con số thực tế được quyết định là kết quả của sự tương tác giữa mỗi lần triển khai phần bổ trợ PCM được xâu chuỗi từ nút PCM đã chọn và trình điều khiển trong nhân hoặc phần bổ trợ PCM I/O.
Lý tưởng nhất, đây là bội số của số lượng khung dữ liệu âm thanh trên mỗi khoảng thời gian, do đó kích thước của khoảng thời gian. Trên thực tế, không phải vậy, tùy thuộc vào việc triển khai các plugin PCM, trình điều khiển trong nhân và các plugin PCM I/O.
Tùy chọn này định cấu hình giá trị đã cho cho tham số phần cứng buffer_time của luồng con PCM. Tùy chọn này tương tự như tùy chọn --buffer-size, tuy nhiên, đơn vị của nó là micro-giây.
Tùy chọn này cho biết loại người phục vụ cho thông báo sự kiện. Hiện tại, có bốn loại; default , select , poll và epoll . Với loại mặc định, 'snd_pcm_wait()' được sử dụng. Với loại select, lệnh gọi hệ thống 'select(2)' được sử dụng. Với loại poll, lệnh gọi hệ thống 'poll(2)' được sử dụng. Với loại epoll, lệnh gọi hệ thống 'epoll(7)' dành riêng cho Linux được sử dụng.
Tùy chọn này phải tương ứng với một trong các tùy chọn --nonblock hoặc --mmap hoặc giá trị timer của --sched-model tùy chọn. Cả tùy chọn này và --test-nowait đều không khả dụng cùng một lúc.
Tùy chọn này chọn mô hình lập lịch trình cho quy trình của chương trình này. Có sẵn một trong số irq hoặc bộ hẹn giờ. Chi tiết vui lòng đọc phần 'MÔ HÌNH LỊCH TRÌNH'.
Khi không có gì được chỉ định, mô hình irq sẽ được sử dụng.
Tùy chọn này định cấu hình giá trị đã cho cho tham số phần mềm thời gian sử dụng tối thiểu của luồng con PCM. Trong chế độ chặn, giá trị được sử dụng làm ngưỡng của số lượng khung dữ liệu âm thanh có sẵn trong bộ đệm của luồng phụ PCM để đánh thức quá trình bị chặn bởi thao tác I/O. Ở chế độ không chặn, bất kỳ thao tác I/O nào cũng trả về -EAGAIN cho đến khi số lượng khung dữ liệu âm thanh khả dụng đạt đến ngưỡng.
Tùy chọn này có hiệu lực trong trường hợp giá trị --mmap hay timer của tùy chọn --sched-model không được sử dụng.
Tùy chọn này định cấu hình giá trị đã cho cho tham số phần mềm start_threshold của luồng con PCM. Giá trị này được sử dụng làm ngưỡng để tự động bắt đầu luồng con PCM. Hiện tại, tùy chọn này có hiệu lực trong trường hợp giá trị --mmap hay timer của tùy chọn --sched-model không được sử dụng.
Đối với quá trình truyền phát lại, khi số lượng khung dữ liệu âm thanh tích lũy trong bộ đệm của luồng phụ PCM mà chương trình này ghi vào đạt đến ngưỡng, luồng phụ PCM sẽ tự động bắt đầu mà không cần lệnh gọi rõ ràng snd_pcm_start() tới PCM dòng phụ.
Đối với truyền chụp, tùy chọn này là vô dụng. Số lượng khung dữ liệu âm thanh tích lũy không tăng lên nếu không có lệnh gọi rõ ràng snd_pcm_start() tới luồng con PCM.
Tùy chọn này có hiệu lực trong trường hợp giá trị --mmap hay timer của tùy chọn --sched-model không được sử dụng.
Tùy chọn này định cấu hình giá trị đã cho cho tham số phần mềm stop_threshold của luồng con PCM. Giá trị này được sử dụng làm ngưỡng để tự động dừng luồng con PCM. Hiện tại, tùy chọn này có hiệu lực trong trường hợp giá trị --mmap hay timer của tùy chọn --sched-model không được sử dụng.
Đối với quá trình truyền chụp, khi số lượng khung dữ liệu âm thanh tích lũy trong bộ đệm của luồng con PCM mà trình điều khiển hoặc phần bổ trợ PCM alsa-lib ghi đạt đến ngưỡng, luồng con PCM sẽ tự động dừng mà không có lệnh gọi rõ ràng snd_pcm_stop() vào dòng phụ PCM. Đây là trường hợp chương trình này để lại các khung dữ liệu âm thanh mà không đọc trong một thời gian.
Đối với quá trình truyền phát lại, khi số lượng khung dữ liệu âm thanh có sẵn trong bộ đệm của luồng phụ PCM mà trình điều khiển hoặc plugin PCM alsa-lib đọc đạt đến ngưỡng, luồng phụ PCM sẽ tự động dừng mà không có lệnh gọi rõ ràng snd_pcm_stop() đến dòng phụ PCM. Đây là trường hợp chương trình này để lại các khung dữ liệu âm thanh mà không ghi trong một thời gian.
Tùy chọn này có hiệu lực trong trường hợp giá trị --mmap hay timer của tùy chọn --sched-model không được sử dụng.
Tùy chọn này có tác dụng đối với plugin 'plug' trong alsa-lib để chặn chuyển đổi tốc độ lấy mẫu cho khung dữ liệu âm thanh.
Tùy chọn này có tác dụng đối với plugin 'plug' trong alsa-lib để chặn chuyển đổi kênh cho khung dữ liệu âm thanh.
Tùy chọn này có tác dụng đối với plugin 'plug' trong alsa-lib để chặn chuyển đổi định dạng mẫu cho khung dữ liệu âm thanh.
Tùy chọn này có tác dụng đối với plugin 'softvol' trong alsa-lib để chặn chuyển đổi mẫu cho khung dữ liệu âm thanh thông qua phần tử điều khiển bổ sung.
Tùy chọn này chặn hoạt động khôi phục từ trạng thái XRUN của dòng phụ PCM đang chạy, sau đó quá trình của chương trình này sẽ kết thúc như bình thường.
Tùy chọn này vô hiệu hóa bất kỳ người phục vụ nào cho thông báo sự kiện I/O. Các thao tác I/O được lặp đi lặp lại cho đến khi có bất kỳ khung dữ liệu âm thanh nào. Tùy chọn mang lại tải nặng trong việc tiêu thụ thời gian CPU.
Chương trình phụ trợ này tự động khả dụng khi tập lệnh cấu hình phát hiện biểu tượng ffado_streaming_init() trong đối tượng dùng chung libffado.
Tùy chọn này sử dụng giá trị đã cho để quyết định bộ điều khiển 1394 OHCI nào được sử dụng để giao tiếp. Khi hệ thống Linux có hai bộ điều khiển 1394 OHCI, 0 hoặc 1 sẽ khả dụng. Cả tùy chọn này và -g đều không khả dụng cùng một lúc. Nếu không có gì được chỉ định, libffado sẽ thực hiện giao tiếp với các đơn vị trên bus IEEE 1394 được quản lý bởi tất cả bộ điều khiển 1394 OHCI có sẵn trong hệ thống Linux.
Tùy chọn này sử dụng giá trị đã cho để quyết định đơn vị nào được sử dụng để giao tiếp. Tùy chọn này yêu cầu tùy chọn -p để cho biết bộ điều khiển 1394 OHCI nào được sử dụng để giao tiếp với thiết bị đã chỉ định.
Tùy chọn này sử dụng giá trị đã cho để quyết định một đơn vị mục tiêu để giao tiếp. Giá trị phải có tiền tố là '0x' và bao gồm các chữ cái theo hệ thập lục phân (0-9, a-f, A-F). Cả tùy chọn này và -p đều không khả dụng cùng một lúc. Nếu không có gì được chỉ định, libffado sẽ thực hiện giao tiếp với các đơn vị trên bus IEEE 1394 được quản lý bởi tất cả bộ điều khiển 1394 OHCI có sẵn trong hệ thống Linux.
Tùy chọn này sử dụng giá trị đã cho để quyết định số lượng khung dữ liệu âm thanh trong một thao tác đọc/ghi. Hoạt động bị chặn cho đến khi số lượng khung dữ liệu âm thanh khả dụng vượt quá giá trị đã cho. Theo mặc định, 512 khung dữ liệu âm thanh được sử dụng.
Tùy chọn này sử dụng giá trị đã cho để quyết định kích thước của bộ đệm trung gian giữa chương trình này và libffado. Theo mặc định, 2 khoảng thời gian cho mỗi bộ đệm được sử dụng.
Tùy chọn này cho phép chương trình này chạy chế độ nô lệ. Trong chế độ này, libffado thêm thư mục đơn vị vào ROM cấu hình của bộ điều khiển 1394 OHCI nơi hệ thống Linux chạy. Thư mục đơn vị có thể được tìm thấy bởi nút khác trên cùng một xe buýt. Hệ thống Linux chạy trên nút có thể truyền gói đẳng thời với khung dữ liệu âm thanh tới thiết bị. Chương trình này có thể nhận gói và tách khung dữ liệu âm thanh.
Tùy chọn này cho phép chương trình này chạy chế độ rình mò. Trong chế độ này, libffado lắng nghe các kênh đẳng thời mà thiết bị chuyển gói đẳng thời. Khi giao tiếp đẳng thời bắt đầu bởi bất kỳ đơn vị nào trên cùng một xe buýt, các gói có thể được xử lý bởi chương trình này.
Tùy chọn này thực thi pthread_setschedparam() trong lệnh gọi ffado_streaming_init() để định cấu hình chính sách lập lịch trình và giá trị đã cho làm mức độ ưu tiên cho các luồng liên quan đến giao tiếp đẳng thời. Giá trị đã cho phải nằm trong tham số RLIMIT_RTPRIO của quy trình. Vui lòng đọc getrlimit(2) để biết chi tiết.
Trong quá trình truyền, SIGINT và SIGTERM sẽ đóng các tệp được xử lý và luồng con PCM sắp kết thúc thời gian chạy.
SIGTSTP sẽ tạm dừng luồng con PCM và SIGCONT sẽ tiếp tục luồng đó. Không có XRUN nào được mong đợi. Với chương trình phụ trợ libffado, việc tạm dừng/tiếp tục không được hỗ trợ và thời gian chạy bị hủy bỏ ngay lập tức.
Các tín hiệu khác thực hiện các hành vi mặc định.
$ axfer transfer playback -d 1 somethingỞ trên sẽ chuyển khung dữ liệu âm thanh trong tệp 'cái gì đó' để phát lại trong 1 giây. Định dạng mẫu được phát hiện tự động để phân tích cú pháp 'cái gì đó' miễn là nó tuân thủ một trong các Microsoft/IBM RIFF/Wave, Sparc AU, Creative Tech. các định dạng giọng nói. Nếu không phát hiện thấy gì, thì nên cung cấp -r , -c và -f hoặc -f với định dạng đặc biệt.
$ axfer transfer playback -r 22050 -c 1 -f S16_LE -t raw somethingPhần trên sẽ truyền khung dữ liệu âm thanh trong tệp 'cái gì đó' không bao gồm thông tin về định dạng mẫu, như định dạng mẫu 22050 Hz, đơn âm, PCM cuối nhỏ 16 bit đã ký để phát lại. Quá trình truyền tiếp tục cho đến khi bắt được SIGINT từ bàn phím hoặc SIGTERM bằng kill(1) .
$ axfer transfer capture -d 10 -f cd something.wavPhần trên sẽ chuyển khung dữ liệu âm thanh sang tệp 'something.wav' dưới dạng định dạng mẫu 44,1 kHz, 2 kênh, PCM little endian 16 bit đã ký, trong 10 giây. Định dạng tệp là Microsoft/IBM RIFF/Wave theo hậu tố của filepath đã cho.
$ axfer transfer capture -s 1024 -r 48000 -c 2 -f S32_BE -I -t au channelsPhần trên sẽ chuyển khung dữ liệu âm thanh dưới dạng định dạng mẫu 48,0 kHz, 2 kênh, PCM big endian 32 bit đã ký cho 1.024 số khung dữ liệu sang các tệp có tên 'channels-1.au' và 'channels-2.au'.
Trong thiết kế của lõi ALSA PCM, thời gian chạy của luồng phụ PCM hỗ trợ hai chế độ; đánh thức theo chu kỳ và đánh thức theo chu kỳ. Hai chế độ này dành cho các mô hình lập lịch trình khác nhau.
Theo mặc định, chế độ đánh thức định kỳ được sử dụng. Ở chế độ này, trình điều khiển trong nhân sẽ vận hành phần cứng để tạo thông báo định kỳ cho việc truyền khung dữ liệu âm thanh. Khoảng thời gian thông báo tương đương với cùng một lượng khung dữ liệu âm thanh như một khoảng thời gian đệm, so với thời gian thực.
Trong trình xử lý được gán cho thông báo, chức năng trợ giúp của lõi ALSA PCM được gọi để cập nhật vị trí cho người đứng đầu truyền phần cứng, sau đó so sánh vị trí đó với vị trí cho người đứng đầu hoạt động của ứng dụng để đánh giá tình trạng tràn/thấp (XRUN) và đánh thức các tiến trình bị chặn.
Với mục đích này, IRQ phần cứng của bộ điều khiển cho bus âm thanh nối tiếp như âm thanh Inter-IC thường được sử dụng. Trong trường hợp này, bộ điều khiển tạo IRQ theo đường truyền trên bus âm thanh nối tiếp. Trong trình xử lý được gán cho IRQ, truyền truy cập phương tiện trực tiếp (DMA) được yêu cầu giữa bộ nhớ máy chủ chuyên dụng và bộ nhớ thiết bị.
Nếu phần cứng mục tiêu không hỗ trợ loại cơ chế này, thông báo định kỳ sẽ được mô phỏng bởi bất kỳ bộ đếm thời gian nào; ví dụ. bộ đếm thời gian, bộ đếm thời gian hạt nhân. Các plugin PCM bên ngoài được tạo bởi SDK plugin PCM trong alsa-lib cũng phải mô phỏng hành vi trên.
Trong chế độ này, các ứng dụng PCM được lập trình theo cách vận hành I/O điển hình. Chúng thực hiện chặn các lệnh gọi hệ thống để đọc/ghi khung dữ liệu âm thanh trong bộ đệm của luồng phụ PCM hoặc chặn các lệnh gọi hệ thống để đợi cho đến khi có bất kỳ khung dữ liệu âm thanh nào. Trong axfer , đây được gọi là mô hình lập lịch trình Dựa trên IRQ và là hành vi mặc định. Người dùng có thể định cấu hình rõ ràng chế độ này bằng cách sử dụng tùy chọn --sched-model với giá trị irq.
Chế độ no-period-wakeup là một chế độ thời gian chạy tùy chọn của luồng con PCM. Chế độ giả định một tính năng cụ thể của phần cứng và hỗ trợ trình điều khiển trong nhân và các ứng dụng PCM. Ở chế độ này, trình điều khiển trong nhân không vận hành phần cứng để tạo thông báo định kỳ cho việc truyền khung dữ liệu âm thanh. Phần cứng sẽ tự động tiếp tục truyền khung dữ liệu âm thanh mà không cần hoạt động định kỳ của trình điều khiển; ví dụ. theo đường truyền DMA được kích hoạt tự động, một chuỗi các bộ mô tả đã đăng ký.
Trong chế độ này, không có gì đánh thức các tiến trình bị chặn, do đó các ứng dụng PCM nên được lập trình mà không có bất kỳ thao tác chặn nào. Vì lý do này, chế độ này được kích hoạt khi các ứng dụng PCM định cấu hình rõ ràng tham số phần cứng cho thời gian chạy của luồng phụ PCM, để tránh gây rối loạn cho các ứng dụng hiện có. Ngoài ra, không có gì duy trì thời gian để truyền khung dữ liệu âm thanh, do đó, các ứng dụng PCM sẽ tự nguyện xử lý bất kỳ bộ đếm thời gian nào để xếp hàng khung dữ liệu âm thanh trong bộ đệm của luồng phụ PCM trong thời gian trôi qua. Hơn nữa, thay vì trình điều khiển, ứng dụng PCM nên gọi chức năng trợ giúp của lõi ALSA PCM để cập nhật vị trí cho đầu truyền phần cứng và để kiểm tra XRUN.
Trong axfer , đây được gọi là mô hình lập lịch trình dựa trên bộ đếm thời gian và khả dụng miễn là phần cứng/trình điều khiển hỗ trợ thời gian chạy no-period-wakeup. Người dùng nên đặt rõ ràng chế độ này bằng cách sử dụng tùy chọn --sched-model với giá trị timer.
Trong mô hình lập lịch trình, các ứng dụng PCM cần quan tâm đến không gian khả dụng trên bộ đệm PCM theo thời gian, thường bằng cách nhường CPU và chờ lập lịch lại. Đối với năng suất, thời gian chờ được tính cho số lượng khung PCM thích hợp hơn để xử lý. Điều này thuận tiện cho một số loại ứng dụng, chẳng hạn như máy chủ âm thanh. khi một luồng I/O của máy chủ chờ hết thời gian chờ, các luồng khác có thể xử lý khung dữ liệu âm thanh cho các máy khách của máy chủ. Hơn nữa, với việc sử dụng tua lại/chuyển tiếp, các ứng dụng có thể đạt được độ trễ thấp giữa vị trí truyền và vị trí xử lý ngay cả khi chúng sử dụng kích thước lớn của bộ đệm PCM.
Lý tưởng nhất là mô hình lập lịch dựa trên bộ đếm thời gian có một số ưu điểm hơn so với mô hình lập lịch dựa trên IRQ. Lúc đầu, không có ngữ cảnh ngắt nào chạy cho luồng con PCM. Dòng con PCM chỉ được xử lý trong bất kỳ ngữ cảnh quy trình nào. Không cần quan tâm đến các điều kiện chạy đua giữa IRQ và bối cảnh quy trình. Điều này làm giảm một số lo ngại cho một số nhà phát triển trình điều khiển và ứng dụng. Thứ hai, thời gian CPU không được sử dụng cho các trình xử lý trong ngữ cảnh ngắt. Thời gian CPU có thể được dành riêng cho các tác vụ khác. Điều này là tốt trong một số điểm của Hệ thống chia sẻ thời gian. Thứ ba, phần cứng không được cấu hình để tạo ngắt. Điều này là tốt ở một điểm có thể giảm mức tiêu thụ điện năng tổng thể.
Trong cả hai mô hình lập lịch trình, phần cứng sẽ cho phép trình điều khiển đọc số lượng khung dữ liệu âm thanh được truyền giữa bộ nhớ chuyên dụng và bộ nhớ thiết bị cho bus nối tiếp âm thanh. Tuy nhiên, trong mô hình lập lịch dựa trên bộ đếm thời gian, độ chi tiết và độ chính xác của giá trị là rất quan trọng. Trên thực tế, phần cứng thực hiện truyền giữa bộ nhớ chuyên dụng và bộ nhớ thiết bị cho một lô nhỏ khung dữ liệu âm thanh hoặc byte. Theo quan điểm của các ứng dụng PCM, độ chi tiết trong đường truyền hiện tại là cần thiết để quyết định thời gian chờ chính xác cho mỗi thao tác I/O. Kể từ nhân Linux v4.21, giao diện ALSA PCM giữa nhân/không gian người dùng không có tính năng báo cáo.
Lệnh con transfer của axfer được thiết kế để duy trì khả năng tương thích với aplay(1). Tuy nhiên, một số tùy chọn bên dưới không tương thích do một số lý do kỹ thuật.
Tùy chọn này chỉ được hỗ trợ cho các tệp lưu trữ khung dữ liệu âm thanh tương ứng với từng kênh. Trong triển khai aplay(1), tùy chọn này có tác dụng bổ sung để sử dụng bộ đệm PCM được căn chỉnh theo thứ tự không xen kẽ nếu thiết bị đích hỗ trợ. Kể từ năm 2018, bộ đệm PCM theo thứ tự không xen kẽ hầu như không được sử dụng bởi các thiết bị âm thanh.
Tùy chọn này cho biết ngưỡng đánh thức quá trình bị chặn trong một đơn vị khung dữ liệu âm thanh. Đối với việc triển khai aplay(1), tùy chọn này không có hiệu lực với tùy chọn --mmap cũng như tùy chọn timer của tùy chọn --sched-model.
Tùy chọn này cho biết ngưỡng để bắt đầu luồng phụ PCM đã chuẩn bị trong một đơn vị khung dữ liệu âm thanh. Đối với việc triển khai aplay(1), tùy chọn này không có hiệu lực với tùy chọn --mmap cũng như tùy chọn timer của tùy chọn --sched-model.
Tùy chọn này cho biết ngưỡng ngừng chạy luồng con PCM trong một đơn vị khung dữ liệu âm thanh. Đối với việc triển khai aplay(1), tùy chọn này không có hiệu lực với tùy chọn --mmap cũng như tùy chọn timer của tùy chọn --sched-model.
Tùy chọn này không được hỗ trợ. Khi triển khai aplay(1), tùy chọn này có tác dụng truyền chụp để lưu tệp tối đa bằng số lượng khung dữ liệu như giá trị đã cho theo đơn vị thứ hai hoặc số lượng khung dữ liệu tối đa được hỗ trợ bởi định dạng tệp được sử dụng. Khi đạt đến giới hạn, tệp đã sử dụng sẽ bị đóng, sau đó tệp mới được mở và khung dữ liệu âm thanh được ghi. Tuy nhiên, tùy chọn này yêu cầu xử lý thêm các tệp và sẽ làm tăng độ phức tạp của vòng lặp chính của axfer.
Tùy chọn này không được hỗ trợ. Trong triển khai aplay(1), tùy chọn có tác dụng truyền chụp để tạo đường dẫn tệp theo định dạng đã cho, trong đó có sẵn một số định dạng bổ sung cũng như các định dạng được strftime(3) hỗ trợ. Tuy nhiên, tùy chọn này yêu cầu xử lý chuỗi bổ sung cho đường dẫn tệp và thật khó chịu nếu được viết bằng ngôn ngữ C.
Tùy chọn này không được hỗ trợ. Trong triển khai aplay(1), tùy chọn có tác dụng tạo tệp cho giá trị đã cho và ghi ID tiến trình cho tệp đó. Tệp này cho phép người dùng lấy ID quy trình và gửi bất kỳ tín hiệu POSIX nào tới quy trình phát. Tuy nhiên, ý tưởng này có một số rắc rối đối với việc khóa tệp khi nhiều quy trình aplay chạy trên cùng một tệp.
Tùy chọn này hiện không được hỗ trợ. Trong triển khai aplay(1), tùy chọn này có tác dụng chiếm thiết bị xuất chuẩn với một số ký tự điều khiển đầu cuối và hiển thị âm thanh cho các kênh đơn và âm thanh nổi. Tuy nhiên, một số vấn đề đặt ra; tính năng này chỉ dành cho các khung dữ liệu âm thanh có định dạng PCM, tính năng này gây rối loạn thiết bị đầu cuối sau khi hủy bỏ, thiết bị xuất chuẩn không khả dụng cho đường ống.
Tùy chọn này hiện không được hỗ trợ. Trong triển khai aplay(1), tùy chọn này có tác dụng chiếm stdin cho đầu vào khóa và tạm dừng/tiếp tục luồng phụ PCM theo phím enter được nhấn. Tuy nhiên, tính năng này yêu cầu xử lý đầu vào bổ sung trong vòng lặp chính và để lại hoạt động khó chịu để duy trì luồng phụ PCM.
Lõi ALSA PCM và lõi điều khiển không hỗ trợ tính năng này, do đó, việc ánh xạ lại phải được thực hiện trong không gian người dùng. Điều này mang lại chi phí chung để căn chỉnh các khung dữ liệu âm thanh, đặc biệt là cho thao tác mmap. Hơn nữa, kể từ phiên bản alsa-lib v1.1.8, dự kiến một số plugin không hỗ trợ tính năng này, do đó, tùy chọn này hoạt động thiếu minh bạch. Hiện tại, tùy chọn này vẫn chưa được hỗ trợ để tránh gây nhầm lẫn cho người dùng.
Thao tác này thực hiện tạm dừng/tiếp tục luồng con PCM. Trong quá trình triển khai aplay(1), các thao tác này mang trạng thái XRUN đến luồng con và tạm dừng/tiếp tục được thực hiện trong chế độ tương tác ở trên. Một số nhà phát triển sử dụng tín hiệu để kiểm tra khôi phục từ XRUN. Hiện tại, không có giải pháp thay thế nào được hỗ trợ cho thử nghiệm.
Điều này không được hỗ trợ. Trong triển khai aplay(1), tín hiệu này được gán cho bộ xử lý để đóng tệp hiện tại để lưu trữ khung dữ liệu âm thanh và mở tệp mới để tiếp tục xử lý. Tuy nhiên, cũng như tùy chọn --max-file-time, tùy chọn này sẽ làm tăng độ phức tạp của vòng lặp chính của axfer.
Chương trình này bao gồm ba mô-đun; xfer , mapper và container . Mỗi mô-đun có một lớp trừu tượng để cho phép triển khai thực tế.
-------- ---------- -------------
device <-> | xfer | <-> | mapper | <-> | container | <-> file
-------- ---------- -------------
libasound single wav
libffado multiple au
voc
rawMô-đun xfer thực hiện truyền thực tế tới các thiết bị và nút. Mô-đun có thể có một số phụ trợ truyền dẫn. Là chương trình phụ trợ mặc định, chương trình phụ trợ libasound được sử dụng để thực hiện truyền qua API alsa-lib. Mô-đun này cho phép mỗi chương trình phụ trợ phân tích các tùy chọn dòng lệnh của riêng họ.
Mô-đun bộ chứa thực hiện đọc/ghi khung dữ liệu âm thanh thông qua bộ mô tả cho tệp/luồng của bộ chứa đa phương tiện hoặc dữ liệu thô. Mô-đun tự động phát hiện loại bộ chứa đa phương tiện và phân tích các tham số trong siêu dữ liệu của tiêu đề dữ liệu. Hiện tại, ba loại bộ chứa đa phương tiện được hỗ trợ; Microsoft/IBM RIFF/Wave ( wav ), Sparc AU ( au ) và giọng nói Công nghệ Sáng tạo ( voc ). Ngoài ra, một vùng chứa đặc biệt được chuẩn bị cho dữ liệu âm thanh thô ( raw ).
Mô-đun mapper xử lý bố cục bộ đệm và căn chỉnh để truyền khung dữ liệu âm thanh. Mô-đun này có hai triển khai; đơn và nhiều . Chương trình phụ trợ đơn sử dụng một vùng chứa để xây dựng bộ đệm. Chương trình phụ trợ nhiều sử dụng một số vùng chứa để xây dựng chương trình phụ trợ.
Giữa mô-đun xfer và mô-đun mapper, một con trỏ tới bộ đệm bao gồm các khung dữ liệu âm thanh được chuyển. Bộ đệm này có hai hình dạng cho thứ tự xen kẽ và không xen kẽ. Trước đây, con trỏ trỏ đến một bộ đệm. Đối với cái sau, con trỏ trỏ đến một mảng trong đó mỗi phần tử trỏ đến một bộ đệm. Giữa mô-đun mapper và mô-đun container, một con trỏ tới một bộ đệm được chuyển vì các bộ chứa phương tiện được hỗ trợ bao gồm các khung dữ liệu âm thanh lưu trữ kiểu thô theo thứ tự xen kẽ.
Khi truyền khung dữ liệu âm thanh giữa các mô-đun, axfer được lập trình để tránh sao chép giữa bộ đệm này sang bộ đệm khác càng nhiều càng tốt. Ví dụ: trong một số trường hợp bên dưới, không xảy ra sao chép giữa các mô-đun.
- xfer(mmap/xen kẽ), ánh xạ (đơn), vùng chứa (bất kỳ) - xfer (mmap/không xen kẽ), ánh xạ (nhiều), vùng chứa (bất kỳ)
Đối với mỗi mô-đun mapper và container, thử nghiệm đơn vị đều khả dụng. Để chạy thử nghiệm, hãy thực hiện lệnh bên dưới:
$ make testMỗi bài kiểm tra lặp lại việc ghi vào tệp và đọc vào tệp nhiều lần và mất nhiều thời gian để hoàn thành. Vui lòng quan tâm đến thời gian thực hiện nếu chạy trên bất kỳ môi trường CI nào.
axfer(1), axfer-list(1), alsamixer(1), amixer(1)
Takashi Sakamoto