Top

리눅스 alsa 프로그래밍 예제

구성 파일의 또 다른 간단한 기능은 별칭입니다. 단순히 별칭에 기존 장치 이름의 매개 변수 할당입니다. 둘 다 동일한 인터페이스의 일부이며 인터페이스 이름은 별칭 값에서 반복되지 않습니다. (asoundrc에 대한 일부 텍스트에서는 “별칭”이라는 단어가 모든 장치 정의에 잘못 사용됩니다.) plug0 장치의 예: 컨트롤 이름의 예는 “마스터 캡처 스위치” 또는 “PCM 재생 볼륨”입니다. 섹션 6. PCM 재생 및 MIDI 입력을 결합하고 미니 신디사이저 miniFMsynth.c를 설명합니다. 이 섹션에서는 Linux 오디오-개발 메일링 리스트에서 폴 데이비스가 제안한 콜백 기반 오디오 재생을 소개합니다. 섹션 7. 예를 들어 작은 아르페지에이터 miniArp.c를 기반으로 ALSA 시퀀서 큐에 MIDI 스케줄링에 대한 짧은 소개를 제공합니다. 당신은 스테레오, 예를 들어, 스테레오 시스템에서 5.1 사운드와 영화를보고 싶어하기 때문에 스테레오 소스를 다운 믹스하려는 경우, 알사 플러그인 패키지에 포함 된 vdownmix 플러그인을 사용합니다. 일부 사운드 칩은 mpu401 물건의 유사하지만 약간 다른 구현을 가지고있다.

예를 들어 emu10k1에는 자체 mpu401 루틴이 있습니다. 첫 번째 경우는 외부 하드웨어 버퍼가 충분히 큰 경우 정상적으로 작동합니다. 이 메서드는 추가 버퍼가 필요하지 않으므로 더 효과적입니다. 데이터 전송을 위해 copy_user 및 copy_kernel 콜백을 정의해야 하며 재생을 위한 fill_silence 콜백도 정의해야 합니다. 그러나 단점이 있습니다: 그것은 mmapped 수 없습니다. 예를 들어 GUS의 GF1 PCM 또는 emu8000의 웨이브 테이블 PCM입니다. 예를 들어 중간 버퍼에 vmalloc()를 통해 할당된 버퍼를 사용할 수 있습니다. 할당된 페이지는 연속되지 않으므로 모든 오프셋에서 실제 주소를 가져오려면 페이지 콜백을 설정해야 합니다. 여기서 두 번째 인수는 만들 proc 파일의 이름을 지정합니다.

위의 예는 카드 디렉토리 아래에 파일 내 파일을 만듭니다(예: /proc/asound/card0/my-file). 다음 섹션에서는 일부 작업 코드를 살펴봅니다. 나는 당신이 컴파일하고 리눅스 시스템에서 이들을 실행하는 것이 좋습니다, 출력을보고 제안 된 수정의 일부를 시도. 이 문서와 함께 제공되는 예제 프로그램의 전체 목록은 ftp.linuxjournal.com/pub/lj/listings/issue126/6735.tgz 다운로드할 수 있습니다. 컴파운드 할당에서와 마찬가지로 등가 기호는 집합체 및 요소 할당 모두에서 선택적으로 삽입할 수 있습니다. plughw 정의의 다음 줄은 각 인수의 데이터 형식을 정의합니다. (분명히 각 배열 요소의 값은 이제 공식 언어의 관점에서 매우 흥미로운 하위 매개 변수의 이름으로 사용됩니다. ;)) plughw의 원래 정의에서 인수를 정의하는 컴파운드에는 @func 키워드를 사용하여 특정 함수를 호출하는 기본 정의도 포함됩니다. 당신이 에 관심이 있다면, alsa.conf에서 보세요. 커널 프로그래밍에서 가장 중요하고 디버깅이 어려운 문제 중 하나는 경합 조건입니다. 리눅스 커널에서, 그들은 일반적으로 스핀 잠금, 뮤텍스 또는 세마포를 통해 피할 수 있습니다. 일반적으로 인터럽트 처리기에서 경합 조건이 발생할 수 있는 경우 원자적으로 관리해야 하며 중요한 세션을 보호하기 위해 스핀잠금을 사용해야 합니다.

임계 섹션이 인터럽트 처리기 코드에 없고 실행하는 데 비교적 오랜 시간이 걸리는 경우 뮤텍스 또는 세마포를 대신 사용해야 합니다. 이 예제와 같이 pci_request_region() 또는 pci_request_regions()를 통해 I/O 포트 또는 메모리 영역을 요청한 경우 해당 기능인 pci_release_region() 또는 pci_release_regions()를 사용하여 리소스를 해제합니다.