首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用cd音频的cd_eject ()方法弹出音频CD,从而产生errno #5?

如何使用cd音频的cd_eject ()方法弹出音频CD,从而产生errno #5?
EN

Stack Overflow用户
提问于 2019-05-01 20:16:44
回答 1查看 70关注 0票数 2

我试图从我的应用程序中播放一张音频CD,方法是使用cdaudio库+一个连接到Raspi3B的USB驱动器。在播放总是之后试图弹出CD使我最终得到errno #5。这是我的代码:

代码语言:javascript
复制
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;
    }
  }
}

这是我得到的输出:

代码语言:javascript
复制
ioctl returned -1
Ejecting CD failed! Error: Input/output error

当我试图弹出CD时,我听到驱动器里有声音,好像它即将进入CD,持续了大约半秒钟。这是我使用的驱动器:

代码语言:javascript
复制
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下):

代码语言:javascript
复制
cdcd> eject
ioctl returned -1

更新2:我发现cdaudioCDAUDIO_EJECT命令调用ioctl (参见源码),但在linux/cdrom.h文件中任何地方都找不到这样的命令。根据https://sourceforge.net/p/libcdaudio/bugs/8/的说法,这只是CDROMEJECT的别名,而不是bug。

更新#3: strace给了我这个输出。我希望这已足够:

代码语言:javascript
复制
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实用程序时,我得到的情况略有不同:

代码语言:javascript
复制
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命令):

代码语言:javascript
复制
open("/dev/sr0", O_RDONLY|O_NONBLOCK)   = 3

还请参见: Question #26240195

EN

回答 1

Stack Overflow用户

发布于 2019-05-10 21:09:42

好的,在研究了eject实用程序几周之后,我发现至少有一些CD驱动器不接受通过ioctl ()CDROMEJECT命令,而是需要一些SCSI命令。实际上,eject包含一个方法,它在这种情况下用作后盾:eject_scsi ()。我将此方法植入cdaudio。测试是成功的。因此,我要求cdaudio的维护人员提供相应的贴片。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55942194

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档