summaryrefslogtreecommitdiff
path: root/cdplayer/cdrom-linux.c
diff options
context:
space:
mode:
Diffstat (limited to 'cdplayer/cdrom-linux.c')
-rw-r--r--cdplayer/cdrom-linux.c330
1 files changed, 0 insertions, 330 deletions
diff --git a/cdplayer/cdrom-linux.c b/cdplayer/cdrom-linux.c
deleted file mode 100644
index 579b72583..000000000
--- a/cdplayer/cdrom-linux.c
+++ /dev/null
@@ -1,330 +0,0 @@
-#include <stdlib.h>
-#include <string.h>
-#include <fcntl.h>
-#include <glib.h>
-#include <sys/ioctl.h>
-#include <unistd.h>
-
-#include <linux/types.h>
-#include <linux/cdrom.h>
-#include "cdrom-interface.h"
-
-
-#define ASSIGN_MSF(dest, src) \
-{ \
- (dest).minute = (src).minute; \
- (dest).second = (src).second; \
- (dest).frame = (src).frame; \
-}
-int
-cdrom_play(cdrom_device_t cdp, int start, int stop)
-{
- struct cdrom_ti ti;
-
- ti.cdti_trk0 = start;
- ti.cdti_ind0 = 1;
- ti.cdti_trk1 = stop;
- ti.cdti_ind1 = 1;
- if (ioctl(cdp->device, CDROMPLAYTRKIND, &ti) == -1) {
- cdp->my_errno = errno;
- return DISC_IO_ERROR;
- }
- return DISC_NO_ERROR;
-}
-
-int
-cdrom_play_msf(cdrom_device_t cdp, cdrom_msf_t * start)
-{
- struct cdrom_msf msf;
-
- if (cdrom_read_track_info(cdp) == DISC_IO_ERROR)
- return DISC_IO_ERROR;
- msf.cdmsf_min0 = start->minute;
- msf.cdmsf_sec0 = start->second;
- msf.cdmsf_frame0 = start->frame;
-
- msf.cdmsf_min1 = cdp->track_info[cdp->nr_track].address.minute;
- msf.cdmsf_sec1 = cdp->track_info[cdp->nr_track].address.second;
- msf.cdmsf_frame1 = cdp->track_info[cdp->nr_track].address.frame;
-
- if (ioctl(cdp->device, CDROMPLAYMSF, &msf) == -1) {
- cdp->my_errno = errno;
- return DISC_IO_ERROR;
- }
- return DISC_NO_ERROR;
-}
-
-int
-cdrom_pause(cdrom_device_t cdp)
-{
- if (ioctl(cdp->device, CDROMPAUSE, 0) == -1) {
- return DISC_IO_ERROR;
- cdp->my_errno = errno;
- }
- return DISC_IO_ERROR;
-}
-
-int
-cdrom_resume(cdrom_device_t cdp)
-{
- if (ioctl(cdp->device, CDROMRESUME, 0) == -1) {
- cdp->my_errno = errno;
- return DISC_IO_ERROR;
- }
- return DISC_NO_ERROR;
-}
-
-
-int
-cdrom_stop(cdrom_device_t cdp)
-{
- if (ioctl(cdp->device, CDROMSTOP, 0) == -1) {
- cdp->my_errno = errno;
- return DISC_IO_ERROR;
- }
- return DISC_NO_ERROR;
-}
-
-int
-cdrom_read_track_info(cdrom_device_t cdp)
-{
- struct cdrom_tochdr toc;
- struct cdrom_tocentry tocentry;
-
- int i, j, nr_track;
-
- if (ioctl(cdp->device, CDROMREADTOCHDR, &toc) == -1) {
- cdp->my_errno = errno;
- return DISC_IO_ERROR;
- }
- cdp->track0 = toc.cdth_trk0;
- cdp->track1 = toc.cdth_trk1;
- nr_track = toc.cdth_trk1 - toc.cdth_trk0 + 1;
- if (nr_track <= 0)
- return DISC_IO_ERROR;
-
- if (nr_track != cdp->nr_track) {
- if (cdp->track_info)
- g_free(cdp->track_info);
- cdp->nr_track = nr_track;
- cdp->track_info = g_malloc((cdp->nr_track + 1) * sizeof(track_info_t));
- }
- for (i = 0, j = cdp->track0; i < cdp->nr_track; i++, j++) {
- tocentry.cdte_track = j;
- tocentry.cdte_format = CDROM_MSF;
-
- if (ioctl(cdp->device, CDROMREADTOCENTRY, &tocentry) == -1) {
- cdp->my_errno = errno;
- return DISC_IO_ERROR;
- }
- /* fill the trackinfo field */
- cdp->track_info[i].track = j;
- cdp->track_info[i].audio_track = tocentry.cdte_ctrl !=
- CDROM_DATA_TRACK ? 1 : 0;
- ASSIGN_MSF(cdp->track_info[i].address, tocentry.cdte_addr.msf);
- }
-
- tocentry.cdte_track = CDROM_LEADOUT;
- tocentry.cdte_format = CDROM_MSF;
- if (ioctl(cdp->device, CDROMREADTOCENTRY, &tocentry) == -1) {
- cdp->my_errno = errno;
- return DISC_IO_ERROR;
- }
- cdp->track_info[i].track = j;
- cdp->track_info[i].audio_track = 0;
- ASSIGN_MSF(cdp->track_info[i].address, tocentry.cdte_addr.msf);
-
- return DISC_NO_ERROR;
-}
-
-int
-cdrom_get_status(cdrom_device_t cdp, cdrom_device_status_t * stat)
-{
- struct cdrom_subchnl subchnl;
- int status;
-
-/*if we have the uniform cdrom api, which I thought was on 2.0 kernels,
- but it doesn't seem to be*/
-#ifdef CDROM_DRIVE_STATUS
- status = ioctl(cdp->device, CDROM_DRIVE_STATUS, CDSL_CURRENT);
-
- /*if the status is -1, then it could mean that we just don't support
- the CDROM_DRIVE_STATUS ioctl*/
- if (status != -1) {
- switch(status) {
- case CDS_DISC_OK:
- break;
- case CDS_TRAY_OPEN:
- return DISC_TRAY_OPEN;
- case CDS_DRIVE_NOT_READY:
- return DISC_DRIVE_NOT_READY;
- default:
- break;
- }
- }
-#endif
-
- subchnl.cdsc_format = CDROM_MSF;
- if (ioctl(cdp->device, CDROMSUBCHNL, &subchnl) == -1) {
- cdp->my_errno = errno;
- return DISC_IO_ERROR;
- }
- switch (subchnl.cdsc_audiostatus) {
- case CDROM_AUDIO_PLAY:
- stat->audio_status = DISC_PLAY;
- break;
- case CDROM_AUDIO_PAUSED:
- stat->audio_status = DISC_PAUSED;
- break;
- case CDROM_AUDIO_COMPLETED:
- stat->audio_status = DISC_COMPLETED;
- break;
- case CDROM_AUDIO_INVALID:
- case CDROM_AUDIO_NO_STATUS:
- case CDROM_AUDIO_ERROR:
- stat->audio_status = DISC_STOP;
- break;
- default:
- stat->audio_status = DISC_ERROR;
- }
- stat->track = subchnl.cdsc_trk;
- ASSIGN_MSF(stat->relative_address, subchnl.cdsc_reladdr.msf);
- ASSIGN_MSF(stat->absolute_address, subchnl.cdsc_absaddr.msf);
- return DISC_NO_ERROR;
-}
-
-cdrom_device_t
-cdrom_open(char *device, int *errcode)
-{
- cdrom_device_t cdp;
-
- cdp = g_malloc(sizeof(struct cdrom_device));
-
- cdp->device = open(device, O_RDONLY|O_NONBLOCK);
- if (cdp->device == -1) {
- *errcode = errno;
- g_free(cdp);
- return NULL;
- }
- cdp->nr_track = 0;
- cdp->track_info = NULL;
- return cdp;
-}
-
-void
-cdrom_close(cdrom_device_t cdp)
-{
- if (cdp->nr_track)
- g_free(cdp->track_info);
- close(cdp->device);
- g_free(cdp);
-}
-
-int
-cdrom_load(cdrom_device_t cdp)
-{
- if (ioctl(cdp->device, CDROMCLOSETRAY, 0) == -1) {
- cdp->my_errno = errno;
- return DISC_IO_ERROR;
- };
- return DISC_NO_ERROR;
-}
-
-int
-cdrom_eject(cdrom_device_t cdp)
-{
- if (ioctl(cdp->device, CDROMEJECT, 0) == -1) {
- cdp->my_errno = errno;
- return DISC_IO_ERROR;
- };
- return DISC_NO_ERROR;
-}
-
-
-int
-cdrom_next(cdrom_device_t cdp)
-{
- cdrom_device_status_t stat;
- int track;
-
- if ((cdrom_read_track_info(cdp) == DISC_IO_ERROR) ||
- (cdrom_get_status(cdp, &stat) == DISC_IO_ERROR))
- return DISC_IO_ERROR;
- track = stat.track + 1;
- return cdrom_play(cdp, stat.track + 1, cdp->track1);
-}
-
-int
-cdrom_prev(cdrom_device_t cdp)
-{
- cdrom_device_status_t stat;
- int track;
-
- if ((cdrom_read_track_info(cdp) == DISC_IO_ERROR) ||
- (cdrom_get_status(cdp, &stat) == DISC_IO_ERROR))
- return DISC_IO_ERROR;
- track = stat.track - 1;
- return cdrom_play(cdp, stat.track - 1, cdp->track1);
-}
-
-int
-cdrom_rewind(cdrom_device_t cdp)
-{
- cdrom_device_status_t stat;
- /* int track; */
-
- if ((cdrom_read_track_info(cdp) == DISC_IO_ERROR) ||
- (cdrom_get_status(cdp, &stat) == DISC_IO_ERROR))
- return DISC_IO_ERROR;
- if (stat.absolute_address.second != 0)
- stat.absolute_address.second--;
- else {
- stat.absolute_address.second = 0;
- if (stat.absolute_address.minute > 0)
- stat.absolute_address.minute--;
- }
- stat.absolute_address.frame = 0;
- return cdrom_play_msf(cdp, &stat.absolute_address);
-}
-
-int
-cdrom_ff(cdrom_device_t cdp)
-{
- cdrom_device_status_t stat;
- /* int track; */
-
- if ((cdrom_read_track_info(cdp) == DISC_IO_ERROR) ||
- (cdrom_get_status(cdp, &stat) == DISC_IO_ERROR))
- return DISC_IO_ERROR;
- stat.absolute_address.second++;
- if (stat.absolute_address.second >= 60) {
- stat.absolute_address.minute++;
- stat.absolute_address.second = 0;
- }
- stat.absolute_address.frame = 0;
- return cdrom_play_msf(cdp, &stat.absolute_address);
-}
-
-int
-cdrom_track_length(cdrom_device_t cdp, int track, cdrom_msf_t * length)
-{
- int index, s1, s2, i;
-
- if ((track < cdp->track0) || (track > cdp->track1))
- return DISC_INDEX_OUT_OF_RANGE;
- index = track - cdp->track0;
-
- s1 = cdp->track_info[index + 1].address.second;
- s2 = cdp->track_info[index].address.second;
- length->second = s1 = s1 - s2;
- if (s1 < 0) {
- i = 1;
- length->second = s1 + 60;
- } else
- i = 0;
-
- length->minute = cdp->track_info[index + 1].address.minute -
- cdp->track_info[index].address.minute - i;
-
- return 0;
-}