如何使用cdaudio的cd_eject()方法弹出音频CD产生errno#5?

时间:2019-05-01 20:16:45

标签: ioctl

我正在尝试使用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

1 个答案:

答案 0 :(得分:0)

好吧,在研究了eject实用工具几周之后,我发现至少有些CD驱动器不会通过CDROMEJECT接受ioctl ()命令,但是需要一个一堆SCSI命令。实际上,eject包含一种方法,在以下情况下用作备用:eject_scsi ()。我将此方法植入了cdaudio中。测试成功。因此,我向cdaudio的维护者询问了各自的patch.