나는 (다른 사용 사례 중에서) 음악 CD를 재생하는 데 사용되는 USB 2.0 CD/DVD 드라이브를 가지고 있습니다. 그러나 드라이브가 CDROMPLAYMSF 명령을 무시하는 것으로 나타납니다.
호스트 머신은 Raspberry Pi 3B이고 현재 버전은 Raspbian입니다. 나는 이것을 libcdaudio
오디오 CD 재생에 사용했는데, CDROMPLAYMSF를 포함하여 필요한 ioctl
명령이 실행되었습니다.
고쳐 쓰다:cd-drive
요청 시 다음 유틸리티에 표시된 대로 내 드라이브의 사양을 제공할 수 있습니다 cdio
.
CD-ROM drive supports MMC 3
Drive: /dev/cdrom
Vendor : MATSHITA
Model : CD-RW CW-8124
Revision : DA0D
Hardware : CD-ROM or DVD
Can eject : Yes
Can close tray : Yes
Can disable manual eject : Yes
Can select juke-box disc : No
Can set drive speed : No
Can read multiple sessions (e.g. PhotoCD) : Yes
Can hard reset device : Yes
Reading....
Can read Mode 2 Form 1 : Yes
Can read Mode 2 Form 2 : Yes
Can read (S)VCD (i.e. Mode 2 Form 1/2) : Yes
Can read C2 Errors : Yes
Can read IRSC : Yes
Can read Media Channel Number (or UPC) : Yes
Can play audio : Yes
Can read CD-DA : Yes
Can read CD-R : Yes
Can read CD-RW : Yes
Can read DVD-ROM : Yes
Writing....
Can write CD-RW : Yes
Can write DVD-R : No
Can write DVD-RAM : No
Can write DVD-RW : No
Can write DVD+RW : No
답변1
원래 CD ROM 드라이브(IDE 시절)에는 마더보드에 대한 아날로그 오디오 연결이 있었습니다. 그러면 SCSI 명령 PLAY
, STOP
및 SCAN
그 변형은 독립형 CD 플레이어처럼 이 아날로그 출력에서 오디오 CD를 재생합니다.
ioctl은 CDROMPLAYMSF
이러한 SCSI 명령 중 하나를 실행합니다. 즉, PLAY AUDIO MSF
MSF는 CD의 위치(분, 초, 프레임 단위)를 정의합니다.
내부 CD ROM은 외부 USB CD ROM과 마찬가지로 이 기능을 상실한 지 오래되었습니다(마더보드에는 아날로그 오디오 연결이 없음). 물론 CD 플레이어는 이 명령을 무시합니다.
IIRC libcdaudio
라이브러리에는 CD에서 디지털 데이터를 읽는 기능도 있습니다. CD를 재생하려면 이를 사용한 다음 Pulseaudio 등에 데이터를 전달해야 합니다.
유사한 기성 명령줄 도구를 사용할 수도 있습니다 mplayer cdda://
.
답변2
리눅스에서커널 소스 코드:
CDROMPLAYMSF Play Audio MSF (struct cdrom_msf)
usage:
struct cdrom_msf msf;
ioctl(fd, CDROMPLAYMSF, &msf);
inputs:
cdrom_msf structure, describing a segment of music to play
outputs: none
error return:
ENOSYS cd drive not audio-capable.
notes:
MSF stands for minutes-seconds-frames
LBA stands for logical block address
Segment is described as start and end times, where each time
is described as minutes:seconds:frames. A frame is 1/75 of
a second.
또한 내 답변이 도움이 될 수 있습니다.커널 소스 코드에서 모든 ioctl 정의를 가져옵니다.
귀하의 질문에 대한 답을 같은 방식으로 찾았습니다. grep
명령을 약간 변경하면 됩니다.
grep -r 'CDROMPLAYMSF' * | vim -
편집하다
~에서Compact_Disc_Digital_Audio#데이터 구조:
오디오 CD의 오디오 데이터 스트림은 연속적이지만 세 부분으로 구성됩니다. 메인 섹션은 재생 가능한 오디오 트랙으로 세분화된 프로그램 영역입니다. 이 섹션 앞에는 가져오기 트랙이 오고 그 뒤에는 내보내기 트랙이 옵니다. 가져오기 및 내보내기 트랙은 무음 오디오만 인코딩하지만 세 부분 모두 하위 코드 스트림을 포함합니다.
리드인 서브코드에는 프로그램 영역과 리드인 영역에서 트랙의 시작 위치에 대한 색인을 제공하는 디스크 목차(TOC)의 복사본이 포함되어 있습니다.트랙 위치는 MSF 형식(프레임이라고 하는 분, 초, 분수 초)의 프로그램 영역 시작 부분을 기준으로 절대 시간 코드로 참조됩니다.각 타임코드 프레임의 길이는 75초이며, 이는 98개 채널의 데이터 프레임 블록, 궁극적으로 588쌍의 왼쪽 및 오른쪽 오디오 샘플 블록에 해당합니다.하위 채널 데이터에 포함된 타임코드를 통해 판독 장치는 TOC의 타임코드에 해당하는 디스크 영역을 찾을 수 있습니다. 디스크의 디렉터리는 하드 드라이브의 파티션 테이블과 유사합니다.
게다가,Compact_Disc_Digital_Audio#Frames_and_timecode_frames:
Redbook 오디오 CD에서 데이터는 다음을 사용하여 생성됩니다.국경없는 의사회구성표, 타임코드는 분, 초 및 다른 유형의 프레임(mm:ss:ff)으로 표현됩니다. 여기서 한 프레임은 오디오의 1/75초에 해당합니다(왼쪽 및 오른쪽 샘플 588쌍). 이 타임코드 프레임은 위에서 언급한 33바이트 채널 데이터 프레임과 다르며 판독 레이저의 시간 표시 및 위치 지정에 사용됩니다.CD 오디오를 편집하고 추출할 때 이 타임코드 프레임은 오디오 CD에서 주소를 지정할 수 있는 가장 작은 시간 간격이므로 트랙 경계는 이러한 프레임 경계에서만 발생합니다.각 구조에는 98개의 데이터 프레임 채널이 포함되어 있으며 총 음악 용량은 98 × 24 = 2,352바이트입니다. CD는 초당 75프레임(또는 섹터)으로 재생되며, 이는 초당 44,100샘플 또는 176,400바이트입니다.
1990년대 CD-ROM 및 관련 디지털 오디오 추출(DAE) 기술에서는 각 타임코드 프레임을 지칭하기 위해 "섹터"라는 용어를 도입했습니다. 각 섹터는 0부터 시작하는 연속적인 정수로 식별되며 트랙은 섹터 경계에 정렬됩니다. 오디오 CD 섹터는 2,352바이트의 디코딩된 데이터에 해당합니다. 레드북에서는 섹터에 대해 언급하지 않으며 MSF 주소 지정 체계의 "프레임" 외에 디스크 데이터 스트림의 해당 부분을 구별하지도 않습니다.