Opened 7 years ago

Closed 14 months ago

#3 closed defect (fixed)

CD player should be capable of playing via digital transfer from attached devices

Reported by: Lewis Rosenthal Owned by:
Priority: major Milestone: 0.3.0 first from Netlabs
Component: Classes Version: 0.2.9
Keywords: Cc:

Description

IBM's CD player (CDPM.EXE) is able to be set to enable digital transfer for devices which have this feature (as most new devices do).

Change History (7)

comment:1 by Lewis Rosenthal, 4 years ago

Milestone: 0.30 first from Netlabs0.3.0 first from Netlabs

Milestone renamed

comment:2 by ecsnl, 4 years ago

It should be possible to use the MCI of MMOS2 to access the digital transfer feature MMOS2 provides. (Switch on via STPM.EXE). I am looking for source code with an example how to use these API calls.

comment:3 by erdmann, 15 months ago

Here is code to switch on "Digital Transfer" and play cd Audio CD track:

/* To compile and link: icc -Q -W3 -G5 -Gd+ -Gm+ -Ti cdaudio.cpp mmpm2.lib; dllrname cdaudio.exe CPPOM30=OS2OM30 */

#define INCL_BASE
#define INCL_PM
#include <os2.h>

#define INCL_OS2MM
#include <os2me.h>

#include <stdio.h>
#include <memory.h>

#define MAX_NUM_TRACKS 50 /* can handle an Audio CD with a maximum of 50 sound tracks */

int main(int argc,char *argv[])
{
   USHORT rc = 0;
   MCI_OPEN_PARMS openParms={0};
   MCI_GENERIC_PARMS genParms={0};
   MCI_TOC_PARMS tocParms={0};
   MCI_TOC_REC tocInfo[MAX_NUM_TRACKS];
   MCI_CONNECTOR_PARMS conParms={0};
   MCI_PLAY_PARMS playParms={0};
   UCHAR errorMsg[256]={0};

   memset(&openParms,0,sizeof(openParms));
   openParms.pszDeviceType = (PSZ)MAKEULONG(MCI_DEVTYPE_CD_AUDIO,0); /* 0 = open default CD-Audio device */
   rc = LOUSHORT(mciSendCommand(0,MCI_OPEN,MCI_OPEN_TYPE_ID | MCI_WAIT,&openParms,0));

   if (NO_ERROR == rc) {

      /* the next command will enable the "Digital Transfer" connection */
      /* instead of playing the audio via the headphone/analog audio connection to a sound card */
      memset(&conParms,0,sizeof(conParms));
      conParms.ulConnectorType = MCI_CD_STREAM_CONNECTOR; /* it is the CD stream connector that establishes this connection */
      rc = LOUSHORT(mciSendCommand(openParms.usDeviceID,MCI_CONNECTOR,MCI_ENABLE_CONNECTOR | MCI_CONNECTOR_TYPE | MCI_WAIT,&conParms,0));

      /* read the toc of the Audio CD */
      /* we need this to select the specific start/end point of a track so that we can seek to it / select a track to play */
      memset(&tocParms,0,sizeof(tocParms));
      tocParms.pBuf = (PTOCREC)tocInfo;
      tocParms.ulBufSize = sizeof(tocInfo);
      rc = LOUSHORT(mciSendCommand(openParms.usDeviceID,MCI_GETTOC,MCI_WAIT,&tocParms,0));
      if (NO_ERROR == rc) {
         memset(&playParms,0,sizeof(playParms));
         /* tocInfo[0].TrackNum contains the 1-based track number but we cannot select this as a starting/end point */
         playParms.ulFrom = tocInfo[0].ulStartAddr;
         playParms.ulTo   = tocInfo[0].ulEndAddr;

         /* now, start playing the track 1 of the Audio CD */
         rc = LOUSHORT(mciSendCommand(openParms.usDeviceID,MCI_PLAY,MCI_FROM | MCI_TO | MCI_WAIT,&playParms,0));
         if (NO_ERROR != rc) {
            rc = mciGetErrorString(rc,(PSZ)errorMsg,sizeof(errorMsg));
            printf("%s\n",errorMsg);
         } /* endif */

         /* when it is done, better stop the playing */
         memset(&genParms,0,sizeof(genParms));
         rc = LOUSHORT(mciSendCommand(openParms.usDeviceID,MCI_STOP,MCI_WAIT,&genParms,0));
      } /* endif */
      memset(&genParms,0,sizeof(genParms));
      rc = LOUSHORT(mciSendCommand(openParms.usDeviceID,MCI_CLOSE,MCI_WAIT,&genParms,0));
   } /* endif */

   return 0;
}

comment:4 by erdmann, 15 months ago

I think the relevant place to implement enablement of "digital transfer" is in:

http://trac.netlabs.org/cwmmclasses/browser/trunk/mediafolder/c/cdfldr/cdfolderoverriddenwpmethods.cpp, routine "ULONG CWCDFolder::cwPlayAudioFile(HWND hwndFrame, ULONG ulWhich)":

after this code:

488	    sprintf(chrCommand,"open \"%s\" alias wave%d SHAREABLE wait", chrDevice, iWavePriv);
489	    rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), playControlDialogFromFrameHWND(hwndFrame), 0);
490	
491	    if((rc & 0x0000ffff)!=MCIERR_SUCCESS)
492	      return 0;

just add (using string command instead of direct MCI commands):

/* enable the "digital transfer" connector */
sprintf(chrCommand,"CONNECTOR wave%d ENABLE TYPE CD stream WAIT", iWavePriv);
rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), playControlDialogFromFrameHWND(hwndFrame), 0);
if((rc & 0x0000ffff)!=MCIERR_SUCCESS)
   return 0;

That should enable "digital transfer" if the CD-ROM device supports that (you could query the capability for this via the "CAPABILITY wave%d CAN STREAM WAIT" command string but I think nowadays every CD-ROM device will support this mode).

Version 0, edited 15 months ago by erdmann (next)

comment:5 by gyoung, 15 months ago

Thanks Lars

I will give this a try and let you know how it works.

comment:6 by gyoung, 14 months ago

Works great Thanks

comment:7 by erdmann, 14 months ago

Resolution: fixed
Status: newclosed
Note: See TracTickets for help on using tickets.