我试图从我的应用程序中播放一张音频CD,方法是使用cdaudio库+一个连接到Raspi3B的USB驱动器。在播放总是之后试图弹出CD使我最终得到errno #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的命令行工具),我也可以在那里复制错误(即使在sudo下):
cdcd> eject
ioctl returned -1更新2:我发现cdaudio用CDAUDIO_EJECT命令调用ioctl (参见源码),但在linux/cdrom.h文件中任何地方都找不到这样的命令。根据https://sourceforge.net/p/libcdaudio/bugs/8/的说法,这只是CDROMEJECT的别名,而不是bug。
更新#3: 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 ()调用的比较显示,cdaudio库显然以只读模式打开驱动器(理论上是正确的,但另一方面,似乎阻塞了eject命令):
open("/dev/sr0", O_RDONLY|O_NONBLOCK) = 3还请参见: Question #26240195
发布于 2019-05-10 21:09:42
好的,在研究了eject实用程序几周之后,我发现至少有一些CD驱动器不接受通过ioctl ()的CDROMEJECT命令,而是需要一些SCSI命令。实际上,eject包含一个方法,它在这种情况下用作后盾:eject_scsi ()。我将此方法植入cdaudio。测试是成功的。因此,我要求cdaudio的维护人员提供相应的贴片。
https://stackoverflow.com/questions/55942194
复制相似问题