Blame example/mmc2a.c

Packit dd8086
/*
Packit dd8086
  Copyright (C) 2006, 2008-2012
Packit dd8086
   Rocky Bernstein <rocky@gnu.org>
Packit dd8086
  
Packit dd8086
  This program is free software: you can redistribute it and/or modify
Packit dd8086
  it under the terms of the GNU General Public License as published by
Packit dd8086
  the Free Software Foundation, either version 3 of the License, or
Packit dd8086
  (at your option) any later version.
Packit dd8086
Packit dd8086
  This program is distributed in the hope that it will be useful,
Packit dd8086
  but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit dd8086
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit dd8086
  GNU General Public License for more details.
Packit dd8086
Packit dd8086
  You should have received a copy of the GNU General Public License
Packit dd8086
  along with this program.  If not, see <http://www.gnu.org/licenses/>.
Packit dd8086
*/
Packit dd8086
Packit dd8086
/* Sample program to show use of the MMC interface. 
Packit dd8086
   An optional drive name can be supplied as an argument.
Packit dd8086
   This basically calls to the libdio mmc_mode_sense_10() and mmc_mode_sense_6 
Packit dd8086
   routines.
Packit dd8086
*/
Packit dd8086
#ifdef HAVE_CONFIG_H
Packit dd8086
#include "config.h"
Packit dd8086
#define __CDIO_CONFIG_H__ 1
Packit dd8086
#endif
Packit dd8086
Packit dd8086
#ifdef HAVE_STDIO_H
Packit dd8086
#include <stdio.h>
Packit dd8086
#endif
Packit dd8086
#ifdef HAVE_SYS_TYPES_H
Packit dd8086
#include <sys/types.h>
Packit dd8086
#endif
Packit dd8086
#ifdef HAVE_STRING_H
Packit dd8086
#include <string.h>
Packit dd8086
#endif
Packit dd8086
#ifdef HAVE_STDLIB_H
Packit dd8086
#include <stdlib.h>
Packit dd8086
#endif
Packit dd8086
Packit dd8086
#include <cdio/cdio.h>
Packit dd8086
#include <cdio/mmc.h>
Packit dd8086
#include <cdio/mmc_cmds.h>
Packit dd8086
Packit dd8086
static void 
Packit dd8086
print_mode_sense (const char *psz_drive, const char *six_or_ten,
Packit dd8086
		  const uint8_t buf[30])
Packit dd8086
{
Packit dd8086
  printf("-- Mode sense %s information for %s:\n", six_or_ten, psz_drive);
Packit dd8086
  if (buf[2] & 0x01) {
Packit dd8086
    printf("-- \tReads CD-R media.\n");
Packit dd8086
  }
Packit dd8086
  if (buf[2] & 0x02) {
Packit dd8086
    printf("-- \tReads CD-RW media.\n");
Packit dd8086
  }
Packit dd8086
  if (buf[2] & 0x04) {
Packit dd8086
    printf("-- \tReads fixed-packet tracks when Addressing type is method 2.\n");
Packit dd8086
  }
Packit dd8086
  if (buf[2] & 0x08) {
Packit dd8086
    printf("-- \tReads DVD ROM media.\n");
Packit dd8086
  }
Packit dd8086
  if (buf[2] & 0x10) {
Packit dd8086
    printf("-- \tReads DVD-R media.\n");
Packit dd8086
  }
Packit dd8086
  if (buf[2] & 0x20) {
Packit dd8086
    printf("-- \tReads DVD-RAM media.\n");
Packit dd8086
  }
Packit dd8086
  if (buf[2] & 0x40) {
Packit dd8086
    printf("-- \tReads DVD-RAM media.\n");
Packit dd8086
  }
Packit dd8086
  if (buf[3] & 0x01) {
Packit dd8086
    printf("-- \tWrites CD-R media.\n");
Packit dd8086
  }
Packit dd8086
  if (buf[3] & 0x02) {
Packit dd8086
    printf("-- \tWrites CD-RW media.\n");
Packit dd8086
  }
Packit dd8086
  if (buf[3] & 0x04) {
Packit dd8086
    printf("-- \tSupports emulation write.\n");
Packit dd8086
  }
Packit dd8086
  if (buf[3] & 0x10) {
Packit dd8086
    printf("-- \tWrites DVD-R media.\n");
Packit dd8086
  }
Packit dd8086
  if (buf[3] & 0x20) {
Packit dd8086
    printf("-- \tWrites DVD-RAM media.\n");
Packit dd8086
  }
Packit dd8086
  if (buf[4] & 0x01) {
Packit dd8086
    printf("-- \tCan play audio.\n");
Packit dd8086
  }
Packit dd8086
  if (buf[4] & 0x02) {
Packit dd8086
    printf("-- \tDelivers composition A/V stream.\n");
Packit dd8086
  }
Packit dd8086
  if (buf[4] & 0x04) {
Packit dd8086
    printf("-- \tSupports digital output on port 2.\n");
Packit dd8086
  }
Packit dd8086
  if (buf[4] & 0x08) {
Packit dd8086
    printf("-- \tSupports digital output on port 1.\n");
Packit dd8086
  }
Packit dd8086
  if (buf[4] & 0x10) {
Packit dd8086
    printf("-- \tReads Mode-2 form 1 (e.g. XA) media.\n");
Packit dd8086
  }
Packit dd8086
  if (buf[4] & 0x20) {
Packit dd8086
    printf("-- \tReads Mode-2 form 2 media.\n");
Packit dd8086
  }
Packit dd8086
  if (buf[4] & 0x40) {
Packit dd8086
    printf("-- \tReads multi-session CD media.\n");
Packit dd8086
  }
Packit dd8086
  if (buf[4] & 0x80) {
Packit dd8086
    printf("-- \tSupports Buffer under-run free recording on CD-R/RW media.\n");
Packit dd8086
  }
Packit dd8086
  if (buf[4] & 0x01) {
Packit dd8086
    printf("-- \tCan read audio data with READ CD.\n");
Packit dd8086
  }
Packit dd8086
  if (buf[4] & 0x02) {
Packit dd8086
    printf("-- \tREAD CD data stream is accurate.\n");
Packit dd8086
  }
Packit dd8086
  if (buf[5] & 0x04) {
Packit dd8086
    printf("-- \tReads R-W subchannel information.\n");
Packit dd8086
  }
Packit dd8086
  if (buf[5] & 0x08) {
Packit dd8086
    printf("-- \tReads de-interleaved R-W subchannel.\n");
Packit dd8086
  }
Packit dd8086
  if (buf[5] & 0x10) {
Packit dd8086
    printf("-- \tSupports C2 error pointers.\n");
Packit dd8086
  }
Packit dd8086
  if (buf[5] & 0x20) {
Packit dd8086
    printf("-- \tReads ISRC information.\n");
Packit dd8086
  }
Packit dd8086
  if (buf[5] & 0x40) {
Packit dd8086
    printf("-- \tReads ISRC informaton.\n");
Packit dd8086
  }
Packit dd8086
  if (buf[5] & 0x40) {
Packit dd8086
    printf("-- \tReads media catalog number (MCN also known as UPC).\n");
Packit dd8086
  }
Packit dd8086
  if (buf[5] & 0x80) {
Packit dd8086
    printf("-- \tReads bar codes.\n");
Packit dd8086
  }
Packit dd8086
  if (buf[6] & 0x01) {
Packit dd8086
    printf("-- \tPREVENT/ALLOW may lock media.\n");
Packit dd8086
  }
Packit dd8086
  printf("-- \tLock state is %slocked.\n", (buf[6] & 0x02) ? "" : "un");
Packit dd8086
  printf("-- \tPREVENT/ALLOW jumper is %spresent.\n", (buf[6] & 0x04) ? "": "not ");
Packit dd8086
  if (buf[6] & 0x08) {
Packit dd8086
    printf("-- \tEjects media with START STOP UNIT.\n");
Packit dd8086
  }
Packit dd8086
  {
Packit dd8086
    const unsigned int i_load_type = (buf[6]>>5 & 0x07);
Packit dd8086
    printf("-- \tLoading mechanism type  is %d: ", i_load_type);
Packit dd8086
    switch (buf[6]>>5 & 0x07) {
Packit dd8086
    case 0: 
Packit dd8086
      printf("caddy type loading mechanism.\n"); 
Packit dd8086
      break;
Packit dd8086
    case 1: 
Packit dd8086
      printf("tray type loading mechanism.\n"); 
Packit dd8086
      break;
Packit dd8086
    case 2: 
Packit dd8086
      printf("popup type loading mechanism.\n");
Packit dd8086
      break;
Packit dd8086
    case 3: 
Packit dd8086
      printf("reserved\n");
Packit dd8086
      break;
Packit dd8086
    case 4: 
Packit dd8086
      printf("changer with individually changeable discs.\n");
Packit dd8086
      break;
Packit dd8086
    case 5: 
Packit dd8086
      printf("changer using Magazine mechanism.\n");
Packit dd8086
      break;
Packit dd8086
    case 6: 
Packit dd8086
      printf("changer using Magazine mechanism.\n");
Packit dd8086
      break;
Packit dd8086
    default:
Packit dd8086
      printf("Invalid.\n");
Packit dd8086
      break;
Packit dd8086
    }
Packit dd8086
  }
Packit dd8086
  
Packit dd8086
  if (buf[7] & 0x01) {
Packit dd8086
    printf("-- \tVolume controls each channel separately.\n");
Packit dd8086
  }
Packit dd8086
  if (buf[7] & 0x02) {
Packit dd8086
    printf("-- \tHas a changer that supports disc present reporting.\n");
Packit dd8086
  }
Packit dd8086
  if (buf[7] & 0x04) {
Packit dd8086
    printf("-- \tCan load empty slot in changer.\n");
Packit dd8086
  }
Packit dd8086
  if (buf[7] & 0x08) {
Packit dd8086
    printf("-- \tSide change capable.\n");
Packit dd8086
  }
Packit dd8086
  if (buf[7] & 0x10) {
Packit dd8086
    printf("-- \tReads raw R-W subchannel information from lead in.\n");
Packit dd8086
  }
Packit dd8086
  {
Packit dd8086
    const unsigned int i_speed_Kbs = CDIO_MMC_GETPOS_LEN16(buf,  8);
Packit dd8086
    printf("-- \tMaximum read speed is %d K bytes/sec (about %dX)\n", 
Packit dd8086
	   i_speed_Kbs, i_speed_Kbs / 176) ;
Packit dd8086
  }
Packit dd8086
  printf("-- \tNumber of Volume levels is %d\n",
Packit dd8086
	 CDIO_MMC_GETPOS_LEN16(buf, 10));
Packit dd8086
  printf("-- \tBuffers size for data is %d KB\n",
Packit dd8086
	 CDIO_MMC_GETPOS_LEN16(buf, 12));
Packit dd8086
  printf("-- \tCurrent read speed is %d KB\n",
Packit dd8086
	 CDIO_MMC_GETPOS_LEN16(buf, 14));
Packit dd8086
  printf("-- \tMaximum write speed is %d KB\n",
Packit dd8086
	 CDIO_MMC_GETPOS_LEN16(buf, 18));
Packit dd8086
  printf("-- \tCurrent write speed is %d KB\n",
Packit dd8086
	 CDIO_MMC_GETPOS_LEN16(buf, 28));
Packit dd8086
}
Packit dd8086
Packit dd8086
Packit dd8086
int
Packit dd8086
main(int argc, const char *argv[])
Packit dd8086
{
Packit dd8086
  CdIo_t *p_cdio;
Packit dd8086
  const char *psz_drive = NULL;
Packit dd8086
Packit dd8086
  if (argc > 1) psz_drive = argv[1];
Packit dd8086
  p_cdio = cdio_open (psz_drive, DRIVER_UNKNOWN);
Packit dd8086
Packit dd8086
  if (!p_cdio) {
Packit dd8086
    printf("-- Couldn't find CD\n");
Packit dd8086
    return 77;
Packit dd8086
  } else {
Packit dd8086
    uint8_t buf[30] = { 0, };    /* Place to hold returned data */
Packit dd8086
    char *psz_cd = cdio_get_default_device(p_cdio);
Packit dd8086
    if (DRIVER_OP_SUCCESS == mmc_mode_sense_6(p_cdio, buf, sizeof(buf),
Packit dd8086
					      CDIO_MMC_CAPABILITIES_PAGE) ) {
Packit dd8086
      print_mode_sense(psz_cd, "6", buf);
Packit dd8086
    } else {
Packit dd8086
      printf("-- Couldn't get MODE_SENSE 6 data.\n");
Packit dd8086
    }
Packit dd8086
    if (DRIVER_OP_SUCCESS == mmc_mode_sense_10(p_cdio, buf, sizeof(buf),
Packit dd8086
					       CDIO_MMC_CAPABILITIES_PAGE) ) {
Packit dd8086
      print_mode_sense(psz_cd, "10", buf);
Packit dd8086
    } else {
Packit dd8086
      printf("-- Couldn't get MODE_SENSE 10 data.\n");
Packit dd8086
    }
Packit dd8086
    free(psz_cd);
Packit dd8086
  }
Packit dd8086
  
Packit dd8086
  cdio_destroy(p_cdio);
Packit dd8086
  
Packit dd8086
  return 0;
Packit dd8086
}