This is CDSCSI.m in view mode; [Download] [Up]
//
// CDSCSI_Class - subclass of SCSI2_Class for CD disk drive devices
//
// Copyright (C) 1994 by Christopher Wolf.
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Library General Public
// License as published by the Free Software Foundation; either
// version 2 of the License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Library General Public License for more details.
//
// You should have received a copy of the GNU Library General Public
// License along with this library; if not, write to the Free
// Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
//
// Bug-reports, comments and questions should be directed to:
// Christopher Wolf <chris@alchemy.geo.cornell.edu>
//
// Portions of this code and documentation are derived from an
// earlier work (SCSI Inquirer) Copyright (C) 1990, 1991, 1992 by
// Jiro Nakamura and used with permission.
//
//
// For best results view this file with a tab size of 4 and
// a display width of 132 columns or wider.
//
// file version information
#define RCSCDM "$Id: CDSCSI.m,v 0.20 94/11/12 01:23:31 chris Exp Locker: chris $"
// generic Unix headers
#import <stdio.h>
#import <libc.h>
// NeXTSTEP headers
#import <appkit/appkit.h>
// SCSI2 class specific headers
#import "CDSCSI.h"
#import "errio.h"
// string constants
const char RCScdm[] = RCSCDM;
const char RCScdh[] = RCSCDH;
@implementation CDSCSI
// ----------------------------------------------------------------------
//
// NAME
// isDevice
//
// RETURNS
// (BOOL) YES if sub-class can handle device, NO otherwise.
//
// EXPLANATION
// It is the sub-classes responsibility to implement this method.
// The method should return YES if the subclass of SCSI can handle
// the device at the current target, NO otherwise.
//
// SEE ALSO
// findDevice (SCSI), findDevice: (SCSI)
//
// ----------------------------------------------------------------------
- (BOOL) isDevice
{
struct inquiry_reply ibuffer;
BOOL result;
PrintFunction oldPf = dprintf;
dprintf = printfToNull;
result = ((![self inquiry: &ibuffer]) && (ibuffer.ir_devicetype == DEVTYPE_CDROM));
dprintf = oldPf;
return result;
}
- (int) eject
{
struct cdb6_start_stop *cdbp = &sr.sr_cdb.cdb6_start_stop;
BOOL wasOpen = isOpen;
int result = -1;
if (wasOpen || ![self openSCSI])
{
[SCSI clearCommandBlock: (cdb *)cdbp];
cdbp->ss_opcode = C6OP_STARTSTOP;
cdbp->ss_lun = lun;
cdbp->ss_loej = 1;
sr.sr_dma_dir = SR_DMA_RD;
sr.sr_addr = NULL;
sr.sr_dma_max = 0;
sr.sr_ioto = timeout;
result = [self performRequest];
}
if (!wasOpen && [self closeSCSI])
{
result = -1;
}
return(result);
}
- (int) readTOC: (struct toc *) toc MSF: (BOOL)msf;
{
struct cdb10_read_toc *cdbp = &sr.sr_cdb.cdb10_read_toc;
BOOL wasOpen = isOpen;
int result = -1;
if (wasOpen || ![self openSCSI])
{
[SCSI clearCommandBlock: (cdb *) cdbp];
cdbp->rtoc_opcode = C10OP_READTOC;
cdbp->rtoc_lun = lun;
cdbp->rtoc_msf = 0;
cdbp->rtoc_starttrack = 0;
writeBigEndianShort(sizeof(*toc),&(cdbp->rtoc_length_BE16));
sr.sr_dma_dir = SR_DMA_RD;
sr.sr_addr = (char *)toc;
sr.sr_dma_max = sizeof(*toc);
sr.sr_ioto = timeout;
result = [self performRequest];
}
if (!wasOpen && [self closeSCSI])
{
result = -1;
}
return result;
}
- (int) playFromMSF:(u_char)firstMinute:(u_char)firstSecond:(u_char)firstFrame
ToMSF:(u_char)lastMinute:(u_char)lastSecond:(u_char)lastFrame
{
struct cdb10_play_audio_msf *cdbp = &sr.sr_cdb.cdb10_play_audio_msf;
BOOL wasOpen = isOpen;
int result = -1;
if (wasOpen || ![self openSCSI])
{
[SCSI clearCommandBlock: (cdb *) cdbp];
cdbp->pam_opcode = C10OP_PLAYAUDIOMSF;
cdbp->pam_start_m = firstMinute;
cdbp->pam_start_s = firstSecond;
cdbp->pam_start_f = firstFrame;
cdbp->pam_end_m = lastMinute;
cdbp->pam_end_s = lastSecond;
cdbp->pam_end_f = lastFrame;
sr.sr_dma_dir = SR_DMA_RD;
sr.sr_addr = NULL;
sr.sr_dma_max = 0;
sr.sr_ioto = timeout;
result = [self performRequest];
}
if (!wasOpen && [self closeSCSI])
{
result = -1;
}
return(result);
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.