--- cdctl.h.orig Sat Sep 5 11:11:26 1998 +++ cdctl.h Sun Mar 24 22:38:59 2002 @@ -30,7 +30,9 @@ #include #include #include -#include +#include +#include +#define CD_MSF_OFFSET 150 // CD status values #define ssData 0 @@ -113,10 +115,10 @@ case acStop: #ifdef _CDCTL_SOFT_STOP - ioctl(cdfd,CDROMSTART); + ioctl(cdfd,CDIOCSTART); #endif #ifndef _CDCTL_SOFT_STOP - ioctl(cdfd,CDROMSTOP); + ioctl(cdfd,CDIOCSTOP); #endif tskOurPlay=false; @@ -127,10 +129,10 @@ tskOurPlay=true; break; case acPause: - ioctl(cdfd,CDROMPAUSE); + ioctl(cdfd,CDIOCPAUSE); break; case acResume: - ioctl(cdfd,CDROMRESUME); + ioctl(cdfd,CDIOCRESUME); break; case acPrev: newtrk--; @@ -157,13 +159,13 @@ } break; case acEject: - if(ioctl(cdfd,CDROMEJECT)) + if(ioctl(cdfd,CDIOCEJECT)) status_state=ssNoCD; else status_state=ssTrayOpen; break; case acClose: - ioctl(cdfd,CDROMCLOSETRAY); + ioctl(cdfd,CDIOCCLOSE); status_state=ssNoCD; break; } @@ -172,9 +174,14 @@ } void doStatus(){ if(cdfdopen){ - struct cdrom_subchnl sc; - sc.cdsc_format=CDROM_MSF; - if(ioctl(cdfd, CDROMSUBCHNL, &sc)){ + struct ioc_read_subchannel sc; + struct cd_sub_channel_info csci; + sc.address_format=CD_MSF_FORMAT; + sc.track = 0; + sc.data=&csci; + sc.data_len=sizeof(csci); + sc.data_format=CD_CURRENT_POSITION; + if(ioctl(cdfd, CDIOCREADSUBCHANNEL, &sc)){ if(status_state!=ssNoCD) status_state=ssTrayOpen; status_track=0; @@ -185,18 +192,18 @@ if(status_state==ssNoCD || status_state==ssTrayOpen) readTOC(); int start,now,stop; - switch(sc.cdsc_audiostatus){ - case CDROM_AUDIO_PLAY: + switch(csci.header.audio_status){ + case CD_AS_PLAY_IN_PROGRESS: if(status_state==ssStopped) tskOurPlay=false; status_state=ssPlaying; break; - case CDROM_AUDIO_PAUSED: + case CD_AS_PLAY_PAUSED: if(status_state==ssStopped) tskOurPlay=false; status_state=ssPaused; break; - case CDROM_AUDIO_COMPLETED: + case CD_AS_PLAY_COMPLETED: if(tskOurPlay){ status_state=ssPlaying; selecttrack(); @@ -212,7 +219,7 @@ if(tskOurPlay){ start = cd_trklist[status_track].track_start; stop = start + cd_trklist[status_track].track_len - _CDCTL_SENSITIVITY; - now = ((sc.cdsc_absaddr.msf.minute) * 60 + sc.cdsc_absaddr.msf.second) * 75 + sc.cdsc_absaddr.msf.frame - CD_MSF_OFFSET; + now = ((csci.what.position.absaddr.msf.minute) * 60 + csci.what.position.absaddr.msf.second) * 75 + csci.what.position.absaddr.msf.frame - CD_MSF_OFFSET; if(now>0 && (now=stop)){ status_state=ssPlaying; selecttrack(); @@ -227,7 +234,7 @@ status_state=ssStopped; } - trackinfo(&sc); + trackinfo(&csci); if(cd_trklist[status_track].track_data) status_state=ssData; } @@ -235,19 +242,21 @@ } void setVolume(int l, int r){ if(cdfdopen){ - struct cdrom_volctrl vol; - vol.channel0=l; - vol.channel1=r; - ioctl(cdfd,CDROMVOLCTRL,&vol); + struct ioc_vol vol; + vol.vol[0]=l; + vol.vol[1]=r; + vol.vol[2]=0; + vol.vol[3]=0; + ioctl(cdfd,CDIOCSETVOL,&vol); readVolume(); } } void readVolume(){ if(cdfdopen){ - struct cdrom_volctrl vol; - ioctl(cdfd,CDROMVOLREAD,&vol); - status_volumel=vol.channel0; - status_volumer=vol.channel1; + struct ioc_vol vol; + ioctl(cdfd,CDIOCGETVOL,&vol); + status_volumel=vol.vol[0]; + status_volumer=vol.vol[1]; } } int getVolumeL(){ @@ -296,12 +305,30 @@ void readTOC(){ if(cd_trklist!=NULL) free(cd_trklist); - struct cdrom_tochdr hdr; - ioctl(cdfd, CDROMREADTOCHDR, &hdr); - cd_tracks=hdr.cdth_trk1; + struct ioc_toc_header hdr; + ioctl(cdfd, CDIOREADTOCHEADER, &hdr); + cd_tracks=hdr.ending_track; cd_trklist=(struct CDTrack *)malloc(cd_tracks*sizeof(struct CDTrack)); +#ifdef __FreeBSD__ + struct ioc_read_toc_entry te; + + te.data_len = (cd_tracks + 1) * sizeof(struct cd_toc_entry); + te.data = (struct cd_toc_entry *)malloc(te.data_len); + te.address_format = CD_LBA_FORMAT; + te.starting_track = 0; + ioctl(cdfd, CDIOREADTOCENTRYS, &te); + for(int i = 0; i < cd_tracks; i++) { + cd_trklist[i].track_data = te.data[i].control & 4 ? true : false; + cd_trklist[i].track_start = ntohl(te.data[i].addr.lba); + cd_trklist[i].track_len = ntohl(te.data[i + 1].addr.lba) + - cd_trklist[i].track_start; + } + cd_len = ntohl(te.data[cd_tracks].addr.lba); + free(te.data); +#else struct cdrom_tocentry te; int prev_addr=0; + for(int i=0;i<=cd_tracks;i++){ if(i==cd_tracks) te.cdte_track=CDROM_LEADOUT; @@ -320,35 +347,42 @@ else cd_len = this_addr; } +#endif } - void trackinfo(struct cdrom_subchnl *subchnl){ + void trackinfo(struct cd_sub_channel_info *subchnl){ + int currenttrack = status_track; + if(status_state==ssPlaying || status_state==ssPaused){ - status_pos=((subchnl->cdsc_absaddr.msf.minute) * 60 + subchnl->cdsc_absaddr.msf.second) * 75 + subchnl->cdsc_absaddr.msf.frame - CD_MSF_OFFSET; + status_pos=((subchnl->what.position.absaddr.msf.minute) * 60 + subchnl->what.position.absaddr.msf.second) * 75 + subchnl->what.position.absaddr.msf.frame - CD_MSF_OFFSET; for(status_track=0;status_track