mirror of
https://git.FreeBSD.org/ports.git
synced 2024-11-01 22:05:08 +00:00
14d7fed412
will begin playing after the current one ends rather than repeating the current one. PR: 12001 Submitted by: Ken Lui <tempest@ecst.csuchico.edu>
247 lines
8.1 KiB
Plaintext
247 lines
8.1 KiB
Plaintext
--- cdctl.h.orig Sat Sep 5 10:11:26 1998
|
|
+++ cdctl.h Thu Dec 23 16:31:59 1999
|
|
@@ -30,7 +30,8 @@
|
|
#include <sys/stat.h>
|
|
#include <fcntl.h>
|
|
#include <unistd.h>
|
|
-#include <linux/cdrom.h>
|
|
+#include <sys/cdio.h>
|
|
+#define CD_MSF_OFFSET 150
|
|
|
|
// CD status values
|
|
#define ssData 0
|
|
@@ -113,10 +114,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 +128,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 +158,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 +173,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 +191,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 +218,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<start || now>=stop)){
|
|
status_state=ssPlaying;
|
|
selecttrack();
|
|
@@ -227,7 +233,7 @@
|
|
|
|
status_state=ssStopped;
|
|
}
|
|
- trackinfo(&sc);
|
|
+ trackinfo(&csci);
|
|
if(cd_trklist[status_track].track_data)
|
|
status_state=ssData;
|
|
}
|
|
@@ -235,19 +241,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 +304,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 +346,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<cd_tracks;status_track++){
|
|
- if(status_pos<cd_trklist[status_track].track_start+cd_trklist[status_track].track_len)
|
|
+ if(status_pos<cd_trklist[status_track].track_start+cd_trklist[status_track].track_len) {
|
|
+ if (status_track != currenttrack) {
|
|
+ status_track = currenttrack;
|
|
+ }
|
|
break;
|
|
+ }
|
|
}
|
|
}
|
|
}
|
|
void play(){
|
|
- struct cdrom_msf pmsf;
|
|
+ struct ioc_play_msf pmsf;
|
|
int abs0=status_pos + CD_MSF_OFFSET;
|
|
int abs1=cd_trklist[status_track].track_start + cd_trklist[status_track].track_len - 1 + CD_MSF_OFFSET;
|
|
- pmsf.cdmsf_min0=abs0/(75*60);
|
|
- pmsf.cdmsf_min1=abs1/(75*60);
|
|
- pmsf.cdmsf_sec0=(abs0%(75*60))/75;
|
|
- pmsf.cdmsf_sec1=(abs1%(75*60))/75;
|
|
- pmsf.cdmsf_frame0=abs0%75;
|
|
- pmsf.cdmsf_frame1=abs1%75;
|
|
+ pmsf.start_m=abs0/(75*60);
|
|
+ pmsf.end_m=abs1/(75*60);
|
|
+ pmsf.start_s=(abs0%(75*60))/75;
|
|
+ pmsf.end_s=(abs1%(75*60))/75;
|
|
+ pmsf.start_f=abs0%75;
|
|
+ pmsf.end_f=abs1%75;
|
|
|
|
#ifdef _CDCTL_STOP_BEFORE_PLAY
|
|
- ioctl(cdfd,CDROMSTOP);
|
|
+ ioctl(cdfd,CDIOCSTOP);
|
|
#endif
|
|
#ifdef _CDCTL_START_BEFORE_PLAY
|
|
- ioctl(cdfd,CDROMSTART);
|
|
+ ioctl(cdfd,CDIOCSTART);
|
|
#endif
|
|
|
|
- ioctl(cdfd,CDROMPLAYMSF,&pmsf);
|
|
+ ioctl(cdfd,CDIOCPLAYMSF,&pmsf);
|
|
}
|
|
void select(int trk){
|
|
status_track=trk;
|
|
@@ -357,10 +390,10 @@
|
|
if(cd_trklist[status_track].track_data){
|
|
|
|
#ifdef _CDCTL_HARD_STOP
|
|
- ioctl(cdfd,CDROMSTOP);
|
|
+ ioctl(cdfd,CDIOCSTOP);
|
|
#endif
|
|
#ifndef _CDCTL_HARD_STOP
|
|
- ioctl(cdfd,CDROMSTART);
|
|
+ ioctl(cdfd,CDIOCSTART);
|
|
#endif
|
|
tskOurPlay=false;
|
|
|