Документ взят из кэша поисковой машины. Адрес оригинального документа : http://crydee.sai.msu.ru/ftproot/pub/misc/doc/os2.hints/read-cd
Дата изменения: Thu Jul 20 14:03:44 1995
Дата индексирования: Sun Apr 10 17:06:05 2016
Кодировка:
From ns.itep.ru!CERN.ch!EU.net!howland.reston.ans.net!vixen.cso.uiuc.edu!news.uoregon.edu!news.bc.net!unixg.ubc.ca!vanbc.wimsey.com!io.org!gvc.com!tor250!org!gryn!x259_414!peter.fitzsimmons Thu Jul 20 14:03:45 1995
Path: ns.itep.ru!CERN.ch!EU.net!howland.reston.ans.net!vixen.cso.uiuc.edu!news.uoregon.edu!news.bc.net!unixg.ubc.ca!vanbc.wimsey.com!io.org!gvc.com!tor250!org!gryn!x259_414!peter.fitzsimmons
From: Peter.Fitzsimmons@x259_414.gryn.org (Peter Fitzsimmons)
Date: 17 Jul 95 00:57:22
Newsgroups: comp.os.os2.programmer.porting
Subject: CDROM trouble, help!!
Message-ID: <8a9_9507170220@tor250.org>
X-FTN-To: Misc1684@Cantua.Canterbury.Ac.Nz
Organization: Gateway: sol3@olc.gvc.com
References: <3ua5b5$o0j@cantua.canterbury.ac.nz>
Lines: 172

m> I am trying to modify a dos-based program that runs in an OS2 DOS box.
m> Its purpose is to read digital audio directly from a CDROM drive without
m> A/D D/A conversion. It runs fine on straight dos with MSCDEX but will not
m> work in an os2 dos box.

Here's something even better --- a real os/2 program that reads a raw cd
(audio cd).

#define INCL_NOPMAPI
#define INCL_DOS
#define INCL_DOSDEVIOCTL
#include
#include
#include
#include
#include

// from /ddk/src/dev/dasd/cdrom/os2cdrom/cdioctl.h:
#define DSF_CDDA_SUPPORT 0x40000000L /*Can read 2352 byte CD-DA sectors*/
#define CDROM_HSG_MODE 0x00
#define CDROM_REDBOOK_MODE 0x01
#define CDDA_BLOCK_LENGTH 2352
#define CD01 0x31304443L

#pragma pack(1)
/*------------------------------------------------*
* Cat 0x80, Func 0x72: Read Long *
*------------------------------------------------*/
struct ReadLong {
ULONG ID_code;
UCHAR address_mode;
USHORT transfer_count;
ULONG start_sector;
UCHAR reserved;
UCHAR interleave_size;
UCHAR interleave_skip_factor;
};
#pragma pack()

HFILE CDOpen(char *drive)
{
ULONG *pulTemp;
ULONG ulDLen;
ULONG ulPLen;
ULONG ulAction;
ULONG rc;
BYTE param[100] = "CD01";
BYTE data[100];
HFILE hDev;



// Open the CD drive specified in the drive variable
// removed exclusive--does it matter?

rc = DosOpen( (PSZ)drive,
&hDev,
&ulAction,
0L,
0L,
FILE_OPEN,
OPEN_FLAGS_DASD | OPEN_ACCESS_READONLY | OPEN_SHARE_DENYNONE
,
0L);

if (rc){
printf("sys%04u: Error opening drive %s\n", rc, drive);
return 0;
}


// check to see if the drive can stream (i.e. read digital data )

ulDLen = sizeof(ULONG);
ulPLen = strlen(param);

rc = DosDevIOCtl( hDev,
IOCTL_CDROMDISK,
CDROMDISK_DEVICESTATUS,
param,
ulPLen,
&ulPLen,
data,
ulDLen,
&ulDLen);


if (!rc){
pulTemp = (PULONG) data;

if (!(*pulTemp & DSF_CDDA_SUPPORT)){
printf("Drive does not support digital transfer.\n") ;
DosClose(hDev);
return 0;
}
}
else printf("sys%04u: ioctl failed\n", rc);
return hDev;
}

ULONG CDRead( HFILE hDev, void *buffer, ULONG ulLength, ULONG ulPosition )
{
APIRET rc;

ULONG ulDLen;
ULONG ulPLen;
struct ReadLong rl;

/********* PROCESS READ ***********/

rl.ID_code = CD01;
rl.address_mode = CDROM_HSG_MODE; //CDROM_REDBOOK_MODE;
rl.transfer_count = ulLength;
rl.start_sector = ulPosition;
rl.reserved = 0;
rl.interleave_size = 0;
rl.interleave_skip_factor = 0;

ulDLen = CDDA_BLOCK_LENGTH * ulLength;
ulPLen = sizeof(rl);

// read in the data from the CD

rc = DosDevIOCtl( hDev,
IOCTL_CDROMDISK,
CDROMDISK_READLONG,
&rl,
ulPLen,
&ulPLen,
buffer,
ulDLen,
&ulDLen);

// advance progress indicator

if (rc)
{
printf( "sys%04u: Error reading CD data\n", rc);
return 0;
}


return ( rl.transfer_count );

}

int main(void)
{
HFILE hf;
FILE *fout;
int sect = 0;
char *buf = malloc(0x1000 * 2);
hf = CDOpen("J:");
if(!hf)
exit(1);
fout = fopen("out.dat", "wb");
if(!fout){
perror("out.dat");
exit(1);
}
while(!kbhit()){
printf("Reading Sector %d\r", sect); fflush(stdout);
if(!CDRead(hf, buf, 1, sect++))
break;
fwrite(buf, CDDA_BLOCK_LENGTH, 1, fout);
}
}


--
| Fidonet: Peter Fitzsimmons 1:259/414
| Internet: Peter.Fitzsimmons@x259_414.gryn.org