freebsd-ports/audio/cdd/files/cdd_atapicmds.c
Luigi Rizzo 4d36880612 cdd port grab audio tracks from CDs.
This port is lobotomized and only works with atapi  waiting for someone
to do the scsi->cam modifications.
(also, this is my first attempt with easy-import...)
1998-12-31 12:02:03 +00:00

165 lines
5.8 KiB
C

/*****************************************************************************
* 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;
}