Date: Tue, 2 Jun 1998 16:48:24 -0700 (PDT) From: aswan@cs.berkeley.edu To: FreeBSD-gnats-submit@FreeBSD.ORG Subject: kern/6843: patch to enable reading digital audio samples from an ide cdrom Message-ID: <199806022348.QAA00158@quimby.cs.berkeley.edu>
next in thread | raw e-mail | index | archive | help
>Number: 6843 >Category: kern >Synopsis: patch to enable reading digital audio samples from an ide cdrom >Confidential: no >Severity: non-critical >Priority: low >Responsible: freebsd-bugs >State: open >Quarter: >Keywords: >Date-Required: >Class: change-request >Submitter-Id: current-users >Arrival-Date: Tue Jun 2 16:50:00 PDT 1998 >Last-Modified: >Originator: Andrew Swan >Organization: U.C. Berkeley >Release: FreeBSD 2.2.6-RELEASE i386 >Environment: Dell Dimenson XPS/H266, FreeBSD 2.2.6-RELEASE, NEC 286/3.05 CD-ROM >Description: I've included a patch here that adds an ioctl(), CDIOCREADAUDIO, to the IDE cd-rom driver. This ioctl can be used to read the digital audio samples directly off an audio cd. At this point, there isn't a good program that uses this new interface to grab audio tracks, but there is a linux program, cdda2wav, that does this which should be easy to port. The patch works on my machine (see above) but I haven't tested it on any different systems or different types of drives. >How-To-Repeat: N/A >Fix: diff -rc sys-clean/i386/isa/atapi.h sys/i386/isa/atapi.h *** sys-clean/i386/isa/atapi.h Tue Jun 2 16:05:34 1998 --- sys/i386/isa/atapi.h Tue Jun 2 16:09:53 1998 *************** *** 123,128 **** --- 123,129 ---- */ #define ATAPI_PLAY_MSF 0x47 /* play by MSF address */ #define ATAPI_PAUSE 0x4b /* stop/start audio operation */ + #define ATAPI_READ_CD 0xbe /* read data */ /* * Nonstandard packet commands diff -rc sys-clean/i386/isa/wcd.c sys/i386/isa/wcd.c *** sys-clean/i386/isa/wcd.c Tue Jun 2 16:05:47 1998 --- sys/i386/isa/wcd.c Tue Jun 2 16:26:04 1998 *************** *** 627,632 **** --- 627,637 ---- *f = lba % 75; } + static inline int msf2lba (u_char m, u_char s, u_char f) + { + return (m*60 + s)*75 + f - 150; + } + /* * Perform special action on behalf of the user. * Knows about the internals of this device *************** *** 925,930 **** --- 930,995 ---- case CDIOCSETRIGHT: return wcd_setchan (t, CHANNEL_1, CHANNEL_1, 0, 0); + + case CDIOCREADAUDIO: { + struct ioc_read_audio* args = (struct ioc_read_audio*) addr; + int lba, frames; + u_char* buffer, *ubuf; + int result = 0; + + if (! t->toc.hdr.ending_track) + return (EIO); + + frames = args->nframes; + if (frames < 0) + return (EINVAL); + + ubuf = args->buffer; + + if (args->address_format == CD_LBA_FORMAT) + lba = htonl(args->address.lba); + else if (args->address_format == CD_MSF_FORMAT) + lba = htonl(msf2lba(args->address.msf.minute, + args->address.msf.second, + args->address.msf.frame)); + else + return (EINVAL); + + #ifndef CD_BUFFER_BLOCKS + #define CD_BUFFER_BLOCKS 8 + #endif + buffer = malloc(CD_BUFFER_BLOCKS * 2352, M_TEMP, M_NOWAIT); + if (!buffer) + return (ENOMEM); + + while (frames > 0) { + u_char blocks; + int size; + + blocks = (frames > CD_BUFFER_BLOCKS) + ? CD_BUFFER_BLOCKS : frames; + size = blocks * 2352; + + result = wcd_request_wait(t, ATAPI_READ_CD, (1<<2), + lba>>24, ((lba>>16)&0xff), + ((lba>>8)&0xff), lba&0xff, 0, 0, + blocks, 0xf0, buffer, size); + if (result != 0) + break; + + result = copyout(buffer, ubuf, size); + if (result != 0) + break; + + ubuf += size; + frames -= blocks; + lba += blocks; + } + + free(buffer, M_TEMP); + return (result); + } + } return (error); } diff -rc sys-clean/sys/cdio.h sys/sys/cdio.h *** sys-clean/sys/cdio.h Tue Jun 2 16:06:31 1998 --- sys/sys/cdio.h Tue Jun 2 16:27:09 1998 *************** *** 273,276 **** --- 273,287 ---- #define CDIOCCAPABILITY _IOR('c',30,struct ioc_capability) /*<2>*/ + struct ioc_read_audio + { + u_char address_format; + union msf_lba address; + int nframes; + u_char* buffer; + }; + + #define CDIOCREADAUDIO _IOWR('c',31,struct ioc_read_audio) + + #endif /* !_SYS_CDIO_H_ */ >Audit-Trail: >Unformatted: To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-bugs" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199806022348.QAA00158>