summaryrefslogtreecommitdiffstats
path: root/audio/cdd/files/cdd_atapicmds.c
diff options
context:
space:
mode:
Diffstat (limited to 'audio/cdd/files/cdd_atapicmds.c')
-rw-r--r--audio/cdd/files/cdd_atapicmds.c165
1 files changed, 165 insertions, 0 deletions
diff --git a/audio/cdd/files/cdd_atapicmds.c b/audio/cdd/files/cdd_atapicmds.c
new file mode 100644
index 0000000..d8098ca
--- /dev/null
+++ b/audio/cdd/files/cdd_atapicmds.c
@@ -0,0 +1,165 @@
+/*****************************************************************************
+* CDD v1.0 Copyright (C) 1996-97, Charles R. Henrich, All Rights Reserved. *
+* *
+* Use in source and binary forms, with or without modification and *
+* Redistribution without modification are permitted provided that the *
+* following conditions are met: *
+* *
+* 1. Redistributions of source code must retain the above copyright *
+* notice, all internal copyright notices, this list of conditions *
+* and the following disclaimer. *
+* 2. Redistributions in binary form must reproduce the above copyright *
+* notice, this list of conditions and the following disclaimer in the *
+* documentation and/or other materials provided with the distribution. *
+* 3. All advertising materials mentioning features or use of this software *
+* must display the following acknowledgement: *
+* CDD was developed in 1996-97 by Charles Henrich *
+* 4. Neither the name of this product (CDD) nor the name of the author *
+* (Charles Henrich) may be used to endorse products that include this *
+* product without specific prior written permission. *
+* 5. No profit may be made from the inclusion, or distribution of this *
+* product. Although a reasonable service charge for the distribution *
+* of this product is permitted where appropriate. *
+* *
+* THIS SOFTWARE IS PROVIDED BY CHARLES HENRICH `` AS IS '' AND ANY EXPRESS *
+* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
+* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE *
+* DISCLAIMED. IN NO EVENT SHALL CHARLES HENRICH BE LIABLE FOR ANY DIRECT, *
+* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES *
+* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR *
+* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) *
+* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT *
+* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY *
+* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF *
+* SUCH DAMAGE. *
+* *
+******************************************************************************
+* *
+* Email: henrich@msu.edu *
+* *
+*****************************************************************************/
+
+#include <stdio.h>
+#include <string.h>
+#include <sys/param.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include "cdd.h"
+#include "cdd_cdcmds.h"
+#include "cdd_util.h"
+
+#include <sys/cdio.h>
+
+int
+atapi_cdrawread(char *buffer, int startlba, int blocksize,
+ int blockstoread, int scsifd)
+{
+ struct ioc_read_audio ira;
+
+ if (blocksize/blockstoread != 2352) {
+ fprintf(stderr, "Ouch, only 2352 (%d)bytes allowed\n",
+ blocksize);
+ return -1 ;
+ }
+#if 0
+fprintf(stderr, "reading %d blocks at %d\n", blockstoread, startlba);
+#endif
+
+ ira.address_format = CD_LBA_FORMAT;
+ ira.address.lba = startlba;
+ ira.nframes = blockstoread;
+ ira.buffer = buffer;
+
+ if (ioctl(scsifd, CDIOCREADAUDIO, &ira) < 0) {
+ perror("CDIOREADAUDIO");
+ exit(-1);
+ }
+ return SUCCESS ;
+}
+
+int
+atapi_getcdtoc(int scsifd, CDTOC * cdtoc)
+{
+ struct ioc_toc_header th;
+ struct ioc_read_toc_entry te;
+ struct cd_toc_entry *cte;
+ int i, tracks, ntracks;
+
+ if (ioctl(scsifd, CDIOREADTOCHEADER, &th) < 0) {
+ perror("CDIOREADTOCHEADER");
+ exit(-1);
+ }
+ ntracks = th.ending_track - th.starting_track + 2;
+ cte = (struct cd_toc_entry *)malloc(sizeof(*cte) * ntracks);
+
+ tracks = ntracks ;
+ if (tracks > 100)
+ tracks = 101;
+
+ te.address_format = CD_LBA_FORMAT;
+ te.starting_track = 0 ;
+ te.data_len = ntracks * sizeof(struct cd_toc_entry);
+ te.data = cte;
+
+ if (ioctl(scsifd, CDIOREADTOCENTRYS, &te) < 0) {
+ perror("CDIOREADTOCENTRYS");
+ exit(-1);
+ }
+fprintf(stderr, "toclen %d\n", cdtoc->toclen);
+ cdtoc->numentries = tracks+1 ;
+ cdtoc->firsttrack = th.starting_track ;
+ cdtoc->lasttrack = th.ending_track ;
+ for (i = 0; i <= tracks; i++) {
+ cdtoc->tocents[i].absaddr = ntohl(cte[i-th.starting_track].addr.lba);
+ cdtoc->tocents[i].tracknumber = cte[i-th.starting_track].track;
+ if (i>0)
+ cdtoc->tocents[i-1].absendaddr =
+ cdtoc->tocents[i].absaddr ;
+ fprintf(stderr, "track %d %d start %8d ctrl 0x%x type 0x%x l %d\n",
+ i,
+ cte[i-th.starting_track].track,
+ ntohl(cte[i-th.starting_track].addr.lba),
+ cte[i-th.starting_track].control,
+ cte[i-th.starting_track].addr_type,
+ cdtoc->tocents[i-1].absendaddr);
+ }
+ return SUCCESS;
+}
+
+int
+atapi_cd_setblocksize(int scsifd, int bytessec)
+{
+ /* nop */
+ return SUCCESS;
+}
+
+int
+atapi_cddaread(char *buffer, int startlba,
+ int blocksize, int blockstoread, int scsifd)
+{
+ return atapi_cdrawread(buffer, startlba, blocksize, blockstoread, scsifd);
+}
+
+int
+atapi_begin_cdda(int scsifd)
+{
+ return atapi_cd_setblocksize(scsifd, 2352);
+}
+
+int
+atapi_end_cdda(int scsifd)
+{
+ return atapi_cd_setblocksize(scsifd, 2048);
+}
+
+int
+atapi_initcd(int scsifd)
+{
+ return SUCCESS;
+}
+
+int
+atapi_resetcd(int scsifd)
+{
+ return SUCCESS;
+}
OpenPOWER on IntegriCloud