//Опрос, управление CD-ROM, получение информации о проигрываемом в данной момент диске #include #include #include #include #include #include #include #include #include #define INT_MAX 4 int fd; struct tms tms_stop, tms_start; clock_t real_stop, real_start; clock_t HZ; /* число ticks в секунде */ //Начало таймера: /* Засечь время момента старта процесса */ void hello(void){ real_start = times(&tms_start); } /* Засечь время окончания процесса */ void bye(){ real_stop = times(&tms_stop); clock_t HZ = sysconf(_SC_CLK_TCK); printf("Real time = %g seconds [%lu ticks]\n",(real_stop - real_start)/ (double) HZ , real_stop - real_start); } int main() { int val; struct cdrom_subchnl info; struct cdrom_tochdr toc; struct cdrom_ti index; struct cdrom_tocentry entry; int i,track,j, status; //for(j=0;j<20;j++) { hello(); //Открытие CD-ROM //O_RDONLY Открывает файл для чтения. /* O_NONBLOCK Устанавливает режим неблокирования. Если O_NONBLOCK установлен, open возвращается немедленно. O_NONBLOCK бит также воздействует на чтение и на запись: он разрешает им возвращаться немедленно с состоянием ошибки, если не имеется никакого доступного ввода, или если вывод не может быть записан. */ if((fd=open("/dev/cdrom",O_RDONLY|O_NONBLOCK))==-1) { perror("Error:"); return 1; } //Проверка на наличие диска в устройстве if(ioctl(fd,CDROM_DRIVE_STATUS,CDSL_CURRENT)!=CDS_DISC_OK) { printf("Status=%d",ioctl(fd,CDROM_DRIVE_STATUS,CDSL_CURRENT)); printf("Net diska v ustroistve\n"); return 1; } else { printf("Disc found\n"); } status=ioctl(fd,CDROM_DISC_STATUS,CDSL_CURRENT); switch (status) { case CDS_NO_DISC: printf("Net diska v ustroistve\n");break; case CDS_AUDIO: printf("Audio disk\n");break; case CDS_MIXED: printf("Mixed disk\n");break; default: printf("Not reconized!\n"); } //Воспроизведение аудиозаписи info.cdsc_format = CDROM_MSF; printf("set audio format:%d\n",CDROM_MSF); //Вызов CDROMSUBCHNL позволяет получить информацию о текущем состоянии устройства - находится ли диск в режиме //воспроизведения, и в какой позиции выполняется чтение данных. ioctl(fd, CDROMSUBCHNL, &info); printf("Format:%d\n",info.cdsc_format); //Получение информации о проигрываемой в данный момент музыке: номер трека, время проигрывания info.cdsc_audiostatus = CDROM_AUDIO_PLAY; printf("set audio status:%x\n",CDROM_AUDIO_PLAY); ioctl(fd, CDROMSUBCHNL, &info); printf("Status:%x\n",info.cdsc_audiostatus); ioctl(fd,CDROMPLAYMSF,CDSL_CURRENT); if (info.cdsc_audiostatus == CDROM_AUDIO_PLAY) { printf("Диск РІ режиме воспроизведения\n"); printf("трек: %i, время воспроизведения: %i%s%i\n", info.cdsc_trk, info.cdsc_reladdr.msf.minute, (info.cdsc_reladdr.msf.second<10) ? ":0" : ":", info.cdsc_reladdr.msf.second); goto end; } //printf("Spinning:%d\n",ioctl(fd,CDROMSTART,CDSL_CURRENT)); //printf("Playing:%d\n",ioctl(fd,CDROMPLAYMSF,CDSL_CURRENT)); //ioctl(fd, CDROMSUBCHNL, &info); ioctl(fd, CDROMREADTOCHDR, &toc); printf("Начальный трек: %i, конечный трек: %i\n", toc.cdth_trk0, toc.cdth_trk1); entry.cdte_format = CDROM_MSF; for (i = toc.cdth_trk0; i <= toc.cdth_trk1; i++) { entry.cdte_track = i; ioctl(fd, CDROMREADTOCENTRY, &entry); if ((entry.cdte_ctrl & CDROM_DATA_TRACK) != 0) printf("трек %i РЅРµ содержит аудиоданных\n", i); else printf("трек %i содержит аудиоданные; начало (MSF): %i:%i:%i\n", i, entry.cdte_addr.msf.minute, entry.cdte_addr.msf.second, entry.cdte_addr.msf.frame); } printf("Укажите трек для воспроизведения "); scanf("%i", &track); index.cdti_trk0 = track; index.cdti_ind0 = 0; index.cdti_trk1 = track; index.cdti_ind1 = 255; if (ioctl(fd, CDROMPLAYTRKIND, &index) < 0) { printf("Невозможно воспроизвести трек %i\n", track); return 1; } if (info.cdsc_audiostatus == CDROM_AUDIO_PLAY) { ioctl(fd,CDROMPLAYMSF,0);//CDSL_CURRENT); printf("Disk is playing\n"); //Форматированный вывод из структуры, если количество секунд меньше 10, в качестве разделителя //пишем ":0" , иначе ":" - 1:02, 1:12 printf("Trek number %i, time of playing is: %i%s%i\n",info.cdsc_trk, info.cdsc_reladdr.msf.minute, (info.cdsc_reladdr.msf.second<10) ? ":0" : ":",info.cdsc_reladdr.msf.second); return 0; } else { printf("No music is playing\n"); ioctl(fd,CDROMEJECT); // } //Выдвинуть лоток CD-ROM sleep(15); end: ioctl(fd,CDROMEJECT); sleep(5); //Задвинуть лоток CD-ROM ioctl(fd,CDROMCLOSETRAY); } //Завершение таймера bye(); } }