Annotation of hatari/src/ymFormat.c, revision 1.1

1.1     ! root        1: /*
        !             2:   Hatari
        !             3: 
        !             4:   YM File output, for use with STSound etc...
        !             5: */
        !             6: 
        !             7: #include "main.h"
        !             8: #include "dialog.h"
        !             9: #include "file.h"
        !            10: #include "memAlloc.h"
        !            11: #include "misc.h"
        !            12: #include "psg.h"
        !            13: #include "screen.h"
        !            14: #include "sound.h"
        !            15: #include "statusBar.h"
        !            16: #include "view.h"
        !            17: #include "ymFormat.h"
        !            18: 
        !            19: #define YM_MAX_VBLS    (50*60*8)            // 50=1 second, 50*60=1 minute, 50*60*8=8 minutes, or 24000
        !            20: #define YM_RECORDSIZE  (4+(YM_MAX_VBLS*NUM_PSG_SOUND_REGISTERS))  // ~330k for 8 minutes
        !            21: 
        !            22: BOOL bRecordingYM = FALSE;
        !            23: int nYMVBLS = 0;
        !            24: unsigned char *pYMWorkspace = NULL, *pYMData;
        !            25: 
        !            26: //-----------------------------------------------------------------------
        !            27: /*
        !            28:   Start recording YM registers to workspace
        !            29: */
        !            30: BOOL YMFormat_BeginRecording(char *pszYMFileName)
        !            31: {
        !            32:   BOOL bSaveYM=FALSE, bWasInWindowsMouse;
        !            33: 
        !            34:   // Free any previous data, don't save
        !            35:   YMFormat_FreeRecording();
        !            36: 
        !            37:   // Make sure we have a filename to use, ask user if not
        !            38:   if (strlen(pszYMFileName)<=0) {
        !            39:     // No, back to Windows so can show dialog
        !            40:     Screen_ReturnFromFullScreen();
        !            41:     // Back to Windows mouse
        !            42: //FIXME    bWasInWindowsMouse = View_ToggleWindowsMouse(MOUSE_WINDOWS);
        !            43:     // Ask user for filename
        !            44:     if (File_OpenSelectDlg(/*hWnd,*/pszYMFileName,FILEFILTER_YMFILE,FALSE,TRUE))
        !            45:       bSaveYM = TRUE;
        !            46:     // If we were in ST mouse mode, revert back
        !            47: //    if (!bWasInWindowsMouse)
        !            48: //FIXME      View_ToggleWindowsMouse(MOUSE_ST);
        !            49:   }
        !            50:   else
        !            51:     bSaveYM = TRUE;
        !            52: 
        !            53:   /* OK to save? */
        !            54:   if (bSaveYM) {
        !            55:     /* Create YM workspace */
        !            56:     pYMWorkspace = (unsigned char *)Memory_Alloc(YM_RECORDSIZE);
        !            57:     if (pYMWorkspace) {
        !            58:       // Get workspace pointer and store 4 byte header
        !            59:       pYMData = pYMWorkspace;
        !            60:       *pYMData++ = 'Y';
        !            61:       *pYMData++ = 'M';
        !            62:       *pYMData++ = '3';
        !            63:       *pYMData++ = '!';
        !            64: 
        !            65:       bRecordingYM = TRUE;        /* Ready to record */
        !            66:       nYMVBLS = 0;          /* Number of VBLs of information */
        !            67: 
        !            68:       /* Set status bar */
        !            69:       StatusBar_SetIcon(STATUS_ICON_SOUND,ICONSTATE_ON);
        !            70:       /* And inform user */
        !            71:       Main_Message("YM Sound data recording started.",PROG_NAME /*,MB_OK|MB_ICONINFORMATION*/);
        !            72:     }
        !            73:     else {
        !            74:       /* Failed to allocate memory, cannot record */
        !            75:       bRecordingYM = FALSE;
        !            76:     }
        !            77:   }
        !            78: 
        !            79:   return(bSaveYM);
        !            80: }
        !            81: 
        !            82: //-----------------------------------------------------------------------
        !            83: /*
        !            84:   End recording YM registers and save as '.YM' file
        !            85: */
        !            86: void YMFormat_EndRecording()
        !            87: {
        !            88:   /* Turn off icon */
        !            89:   StatusBar_SetIcon(STATUS_ICON_SOUND,ICONSTATE_OFF);
        !            90: 
        !            91:   /* Have recorded information? */
        !            92:   if (pYMWorkspace && nYMVBLS) {
        !            93:     /* Convert YM to correct format(list of register 1, then register 2...) */
        !            94:     if (YMFormat_ConvertToStreams()) {
        !            95:       /* Save YM File */
        !            96:       if (0 /*FIXME:*//*strlen(ConfigureParams.Sound.szYMCaptureFileName)>0*/ ) {
        !            97: //FIXME        File_Save(/*hWnd,*/ConfigureParams.Sound.szYMCaptureFileName,pYMWorkspace,(long)(nYMVBLS*NUM_PSG_SOUND_REGISTERS)+4,FALSE);
        !            98:         /* And inform user(this only happens from dialog) */
        !            99:         Main_Message("YM Sound data recording stopped.",PROG_NAME /*,MB_OK|MB_ICONINFORMATION*/);
        !           100:       }
        !           101:     }
        !           102:   }
        !           103: 
        !           104:   /* And free */
        !           105:   YMFormat_FreeRecording();
        !           106: }
        !           107: 
        !           108: //-----------------------------------------------------------------------
        !           109: /*
        !           110:   Free up any resources used by YM recording
        !           111: */
        !           112: void YMFormat_FreeRecording(void)
        !           113: {
        !           114:   // Free workspace
        !           115:   if (pYMWorkspace)
        !           116:     Memory_Free(pYMWorkspace);
        !           117:   pYMWorkspace = NULL;
        !           118: 
        !           119:   // Stop recording
        !           120:   bRecordingYM = FALSE;
        !           121: }
        !           122: 
        !           123: //-----------------------------------------------------------------------
        !           124: /*
        !           125:   Store a VBLs worth of YM registers to workspace - call each VBL
        !           126: */
        !           127: void YMFormat_UpdateRecording(void)
        !           128: {
        !           129:   int i;
        !           130: 
        !           131:   // Can record this VBL information?
        !           132:   if (bRecordingYM) {
        !           133:     // Copy VBL registers to workspace
        !           134:     for(i=0; i<(NUM_PSG_SOUND_REGISTERS-1); i++)
        !           135:       *pYMData++ = PSGRegisters[i];
        !           136:     // Handle register '13'(PSG_REG_ENV_SHAPE) correctly - store 0xFF is did not write to this frame
        !           137:     if (bEnvelopeFreqFlag)
        !           138:       *pYMData++ = PSGRegisters[PSG_REG_ENV_SHAPE];
        !           139:     else
        !           140:       *pYMData++ = 0xff;
        !           141: 
        !           142:     // Increase VBL count
        !           143:     nYMVBLS++;
        !           144:     // If run out of workspace, just save
        !           145:     if (nYMVBLS>=YM_MAX_VBLS)
        !           146:       YMFormat_EndRecording(NULL);
        !           147:   }
        !           148: }
        !           149: 
        !           150: //-----------------------------------------------------------------------
        !           151: /*
        !           152:   Convert YM data to stream for output
        !           153: 
        !           154:   Data is:
        !           155:     4 Byte header 'YM3!'
        !           156:     VBL Count x 14 PSG registers
        !           157:   BUT
        !           158:     We need data in a register stream, eg Reg 0, VBL 1, VBL 2, VBL n and then next register...
        !           159: 
        !           160:   Convert to new workspace and return TRUE if all OK
        !           161: */
        !           162: BOOL YMFormat_ConvertToStreams(void)
        !           163: {
        !           164:   unsigned char *pNewYMWorkspace;
        !           165:   unsigned char *pYMData, *pNewYMData;
        !           166:   unsigned char *pYMStream, *pNewYMStream;
        !           167:   int Reg, Count;
        !           168: 
        !           169:   // Allocate new workspace to convert data to
        !           170:   pNewYMWorkspace = (unsigned char *)Memory_Alloc(YM_RECORDSIZE);
        !           171:   if (pNewYMWorkspace) {
        !           172:     // Convert data, first copy over header
        !           173:     pYMData = pYMWorkspace;
        !           174:     pNewYMData = pNewYMWorkspace;
        !           175:     *pNewYMData++ = *pYMData++;
        !           176:     *pNewYMData++ = *pYMData++;
        !           177:     *pNewYMData++ = *pYMData++;
        !           178:     *pNewYMData++ = *pYMData++;
        !           179: 
        !           180:     // Now copy over each stream
        !           181:     for(Reg=0; Reg<NUM_PSG_SOUND_REGISTERS; Reg++) {
        !           182:       // Get pointer to source / destination
        !           183:       pYMStream = pYMData + Reg;
        !           184:       pNewYMStream = pNewYMData + (Reg*nYMVBLS);
        !           185: 
        !           186:       // Copy recording VBLs worth
        !           187:       for(Count=0; Count<nYMVBLS; Count++) {
        !           188:         *pNewYMStream++ = *pYMStream;
        !           189:         pYMStream += NUM_PSG_SOUND_REGISTERS;
        !           190:       }
        !           191:     }
        !           192: 
        !           193:     // Delete old workspace and assign new
        !           194:     Memory_Free(pYMWorkspace);
        !           195:     pYMWorkspace = pNewYMWorkspace;
        !           196: 
        !           197:     return(TRUE);
        !           198:   }
        !           199:   else
        !           200:     return(FALSE);
        !           201: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.