Как извлечь аудио CD с помощью метода cdaudio cdaudio (), чтобы получить errno #5?

Я пытаюсь воспроизвести аудио-CD из моего приложения, используя cdaudio библиотека + USB-привод DVD, подключенный к Raspi 3B. Попытка извлечь компакт-диск после воспроизведения всегда приводит к ошибке #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

При попытке извлечь компакт-диск я слышу шум в приводе, как будто он собирался получить доступ к компакт-диску в течение примерно половины секунды. Это диск, который я использую:

pi@autoradio:~ $ ls -al /dev/sr*
brw-rw----+ 1 root cdrom 11, 0 Mai  1 21:38 /dev/sr0

Извлечение компакт-диска из командной строки (eject /dev/sr0), работает, хотя.

Кто-нибудь знает, что может вызвать эту ошибку? Спасибо.

ОБНОВЛЕНИЕ № 1: я дал cdcd (инструмент командной строки для аудио компакт-дисков), попробуйте, и я мог бы воспроизвести ошибку там же (даже в sudo):

cdcd> eject
ioctl returned -1

ОБНОВЛЕНИЕ № 2: я узнал, что cdaudio звонки ioctl с CDAUDIO_EJECT команда (см. исходный код), но я не могу найти такую ​​команду нигде в файле linux / cdrom.h. По словам одного из разработчиков библиотеки cdaudio, это просто псевдоним для CDROMEJECT и не ошибка.

ОБНОВЛЕНИЕ № 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

СМОТРИ ТАКЖЕ: Вопрос № 26240195

1 ответ

Хорошо, после нескольких недель изучения eject Утилита, я обнаружил, что по крайней мере некоторые приводы компакт-дисков не будут принимать CDROMEJECT команда через ioctl (), но требуется куча команд SCSI. По факту, eject содержит метод, который используется как запасной вариант в таких ситуациях: eject_scsi (), Я имплантировал этот метод в cdaudio, Испытания прошли успешно. Поэтому я спросил хранителей cdaudio для соответствующего патча.

Другие вопросы по тегам