Example #1
0
File: mcdr.cpp Project: msdsgn/mcdr
/* ======================================================================= */
PCDTRACK GetCDROMTracks(PWINDOWHANDLES H, HANDLE CDHandle, LPDWORD DT, LPDWORD TrackCount)
{
  PCDTRACK CDTrackData = NULL;
  PCDROM_TOC Table = NULL;

  for(;;)
  {
    SendMessage(H->PO, PBM_SETRANGE32, 0, 1);
    SendMessage(H->PO, PBM_SETPOS, 0, 0);

    Table = GetCDROMTrackData(H, CDHandle);

    if(Table == NULL)
      return NULL;

    *TrackCount = Table->LastTrack - (Table->FirstTrack - 1);

    if(*TrackCount > 0)
    {
      CDTrackData = new CDTRACK[*TrackCount];

      *DT = 0;

      DWORD Track;
      for(Track=0; Track<*TrackCount; ++Track)
      {
        CDTrackData[Track].Address = AddressToSectors(Table->TrackData[Track].Address);
        CDTrackData[Track].Length = AddressToSectors(Table->TrackData[Track+1].Address) - CDTrackData[Track].Address;
        *DT += CDTrackData[Track].Length/SECTORS_AT_READ;
      }

      Log(LOG_WRITE, "Found %u (%u to %u) audio tracks on CD-ROM media", *TrackCount, Table->FirstTrack, Table->LastTrack);
      SetLabel(H->WT, "Found %u CD digital audio tracks!", *TrackCount);
      break;
    }
    SetLabel(H->WT, "Scanning for tracks failed!\nNo CD digital audio tracks detected!");
    Log(LOG_WRITE, "There are no tracks on this CD media");
    if(MessageBoxF(H->WH, WindowName, MB_ICONEXCLAMATION | MB_RETRYCANCEL, "This CD-ROM does not contain any tracks!\nPlease insert a CD-ROM with audio tracks.\n\nPress RETRY to try again.\nPress CANCEL to terminate.") == IDCANCEL)
      break;
    delete Table;
  }

  delete Table;

  SendMessage(H->PO, PBM_SETRANGE32, 0, 1);
  SendMessage(H->PO, PBM_SETPOS, 1, 0);
  SendMessage(H->PA, PBM_SETPOS, 4, 0);

  return CDTrackData;
}
Example #2
0
int mb_disc_read_unportable_nt(mb_disc_private *disc, const char *device)
{
	HANDLE hDevice;
	DWORD dwReturned;
	BOOL bResult;
	CDROM_TOC toc;
	CDROM_TOC_SESSION_DATA session;
	char filename[128], *colon;
	int i, len;

	strcpy(filename, "\\\\.\\");
	len = strlen(device);
	if (colon = strchr(device, ':')) {
		len = colon - device + 1;
	}
	strncat(filename, device, len > 120 ? 120 : len);
	printf("%s\n", device);
	printf("%s\n", filename);

	hDevice = CreateFile(filename, GENERIC_READ,
	                     FILE_SHARE_READ | FILE_SHARE_WRITE, 
	                     NULL, OPEN_EXISTING, 0, NULL);	
	if (hDevice == INVALID_HANDLE_VALUE) {
		snprintf(disc->error_msg, MB_ERROR_MSG_LENGTH,
			"couldn't open the CD audio device");
		return 0;
	}	

	bResult = DeviceIoControl(hDevice, IOCTL_CDROM_GET_LAST_SESSION,
	                          NULL, 0,
	                          &session, sizeof(session),
	                          &dwReturned, NULL);
	if (bResult == FALSE) {
		snprintf(disc->error_msg, MB_ERROR_MSG_LENGTH,
		         "error while reading the CD TOC");
		CloseHandle(hDevice);
		return 0;
	}

	bResult = DeviceIoControl(hDevice, IOCTL_CDROM_READ_TOC,
	                          NULL, 0,
	                          &toc, sizeof(toc),
	                          &dwReturned, NULL);
	if (bResult == FALSE) {
		snprintf(disc->error_msg, MB_ERROR_MSG_LENGTH,
		         "error while reading the CD TOC");
		CloseHandle(hDevice);
		return 0;
	}

	CloseHandle(hDevice);

	disc->first_track_num = toc.FirstTrack;
	disc->last_track_num = toc.LastTrack;

	/* multi-session disc */
	if (session.FirstCompleteSession != session.LastCompleteSession) {
		disc->last_track_num = session.TrackData[0].TrackNumber - 1;
		disc->track_offsets[0] =
			AddressToSectors(toc.TrackData[disc->last_track_num].Address) -
			XA_INTERVAL;
	}
	else {
		disc->track_offsets[0] =
			AddressToSectors(toc.TrackData[disc->last_track_num].Address);
	}

	for (i = disc->first_track_num; i <= disc->last_track_num; i++) {
		disc->track_offsets[i] = AddressToSectors(toc.TrackData[i - 1].Address);
	}

	return 1;
}