我正在尝试使用cdaudio
库+附加到Raspi 3B的USB DVD驱动器从应用程序中播放音频CD。尝试在播放总是之后弹出CD,使我最终遇到错误编号5。这是我的代码:
void sound::Eject ()
{
struct disc_status cd_stat;
if (sound::current_sound_source == CD) {
sound::Stop ();
cd_poll (sound::cd_drive_handler, &cd_stat);
if (sound::is_cd_stopped && cd_stat.status_present == 1) {
if ((cd_eject (sound::cd_drive_handler)) < 0) cout << "Ejecting CD failed! Error: " << strerror (errno) << endl;
}
}
}
这是我得到的输出:
ioctl returned -1
Ejecting CD failed! Error: Input/output error
当试图弹出CD时,我听到驱动器中的声音大约半秒钟,好像它正要访问CD一样。这是我正在使用的驱动器:
pi@autoradio:~ $ ls -al /dev/sr*
brw-rw----+ 1 root cdrom 11, 0 Mai 1 21:38 /dev/sr0
不过,可以从命令行(eject /dev/sr0
)弹出CD。
有人知道什么可能导致此错误吗?谢谢。
更新#1:我尝试了cdcd
(用于音频CD的命令行工具),我也可以在那里重现错误(即使在{{1}下) }):
sudo
更新#2:我发现cdcd> eject
ioctl returned -1
使用cdaudio
命令调用ioctl
(请参阅sourcecode),但是我可以在linux/cdrom.h文件的任何位置都找不到这样的命令。 根据one of the developers of the cdaudio library ,这只是CDAUDIO_EJECT
的别名,而不是错误。
更新#3: CDROMEJECT
给我这个输出。我希望这足够了:
strace
相反,在跟踪ioctl(3, CDROM_DISC_STATUS, 0) = 100
ioctl(3, CDROMSUBCHNL, 0x7e93e308) = 0
ioctl(3, CDROMEJECT, 0x1) = -1 EIO (Input/output error)
write(1, "ioctl returned -1\n", 18) = 18
实用程序时,我得到了一些不同:
eject
对geteuid32() = 1000
open("/dev/sr0", O_RDWR|O_NONBLOCK) = 3
ioctl(3, CDROMEJECT, 0x1) = 0
close(3) = 0
exit_group(0) = ?
+++ exited with 0 +++
调用的比较显示,open ()
库显然以只读模式打开了驱动器(理论上是正确的,但另一方面,似乎使{{ 1}}命令):
cdaudio
另请参见:问题#26240195
答案 0 :(得分:0)
好吧,在研究了eject
实用工具几周之后,我发现至少有些CD驱动器不会通过CDROMEJECT
接受ioctl ()
命令,但是需要一个一堆SCSI命令。实际上,eject
包含一种方法,在以下情况下用作备用:eject_scsi ()
。我将此方法植入了cdaudio
中。测试成功。因此,我向cdaudio
的维护者询问了各自的patch.