Annotation of q_a/samples/reverse/reverse.c, revision 1.1

1.1     ! root        1: /* reverse.c - WinMain() and WndProc() for REVERSE, along with
        !             2:  *      initialization and support code.
        !             3:  *
        !             4:  * REVERSE is a Windows with Multimedia sample application that
        !             5:  *  illustrates how to use the low-level waveform playback services.
        !             6:  *  It also shows how to use the multimedia file I/O services to read
        !             7:  *  data from a WAVE file.
        !             8:  *
        !             9:  *  REVERSE plays a WAVE waveform audio file backwards.
        !            10:  *
        !            11:  *    (C) Copyright Microsoft Corp. 1991, 1992.  All rights reserved.
        !            12:  *
        !            13:  *    You have a royalty-free right to use, modify, reproduce and
        !            14:  *    distribute the Sample Files (and/or any modified version) in
        !            15:  *    any way you find useful, provided that you agree that
        !            16:  *    Microsoft has no warranty obligations or liability for any
        !            17:  *    Sample Application Files which are modified.
        !            18:  *
        !            19:  */
        !            20: 
        !            21: #include <windows.h>
        !            22: #include <mmsystem.h>
        !            23: #include "reverse.h"
        !            24: 
        !            25: #define MAX_FILENAME_SIZE   128
        !            26: 
        !            27: /* Global variables.
        !            28:  */
        !            29: char        szAppName[] = "Reverse";    // application name
        !            30: HANDLE      hInstApp    = NULL;         // instance handle
        !            31: HWND        hwndApp     = NULL;         // main window handle
        !            32: HWND        hwndName    = NULL;         // filename window handle
        !            33: HWND        hwndPlay    = NULL;         // "Play" button window handle
        !            34: HWND        hwndQuit    = NULL;         // "Exit" button window handle
        !            35: HWAVEOUT    hWaveOut    = NULL;
        !            36: LPWAVEHDR   lpWaveHdr   = NULL;
        !            37: VOID        cleanup(LPWAVEINST lpWaveInst);
        !            38: 
        !            39: 
        !            40: /* WinMain - Entry point for Reverse.
        !            41:  */
        !            42: int PASCAL WinMain(HANDLE hInst, HANDLE hPrev, LPSTR szCmdLine, int cmdShow)
        !            43: {
        !            44:     MSG         msg;
        !            45:     WNDCLASS    wc;
        !            46: 
        !            47:     hInstApp =  hInst;
        !            48: 
        !            49:     /* Define and register a window class for the main window.
        !            50:      */
        !            51:     if (!hPrev)
        !            52:     {
        !            53:         wc.hCursor        = LoadCursor(NULL, IDC_ARROW);
        !            54:         wc.hIcon          = LoadIcon(hInst, szAppName);
        !            55:         wc.lpszMenuName   = szAppName;
        !            56:         wc.lpszClassName  = szAppName;
        !            57:         wc.hbrBackground  = GetStockObject(LTGRAY_BRUSH);
        !            58:         wc.hInstance      = hInst;
        !            59:         wc.style          = 0;
        !            60:         wc.lpfnWndProc    = WndProc;
        !            61:         wc.cbWndExtra     = 0;
        !            62:         wc.cbClsExtra     = 0;
        !            63: 
        !            64:         if (!RegisterClass(&wc))
        !            65:         return FALSE;
        !            66:     }
        !            67: 
        !            68:     /* Create and show the main window.
        !            69:      */
        !            70:     hwndApp = CreateWindow (szAppName,              // class name
        !            71:                             szAppName,              // caption
        !            72:                             WS_OVERLAPPEDWINDOW,    // style bits
        !            73:                             CW_USEDEFAULT,          // x position
        !            74:                             CW_USEDEFAULT,          // y position
        !            75:                             WMAIN_DX,               // x size
        !            76:                             WMAIN_DY,               // y size
        !            77:                             (HWND)NULL,             // parent window
        !            78:                             (HMENU)NULL,            // use class menu
        !            79:                             (HANDLE)hInst,          // instance handle
        !            80:                             (LPSTR)NULL             // no params to pass on
        !            81:                            );
        !            82:     /* Create child windows for the "Play" and "Exit" buttons
        !            83:      * and for an edit field to enter filenames.
        !            84:      */
        !            85:     hwndPlay = CreateWindow( "BUTTON", "Play",
        !            86:             WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
        !            87:             PLAY_X, PLAY_Y,
        !            88:             PLAY_DX, PLAY_DY,
        !            89:             hwndApp, (HMENU)IDB_PLAY, hInstApp, NULL );
        !            90:     if( !hwndPlay )
        !            91:         return( FALSE );
        !            92: 
        !            93:     hwndQuit = CreateWindow( "BUTTON", "Exit",
        !            94:             WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
        !            95:             QUIT_X, QUIT_Y,
        !            96:             QUIT_DX, QUIT_DY,
        !            97:             hwndApp, (HMENU)IDB_QUIT, hInstApp, NULL );
        !            98:     if( !hwndQuit )
        !            99:         return( FALSE );
        !           100: 
        !           101:     hwndName = CreateWindow("EDIT","",
        !           102:             WS_CHILD|WS_VISIBLE|WS_BORDER|ES_AUTOHSCROLL,
        !           103:             NAME_X, NAME_Y,
        !           104:             NAME_DX, NAME_DY,
        !           105:             hwndApp, (HMENU)IDE_NAME, hInstApp, NULL);
        !           106:     if( !hwndName )
        !           107:         return( FALSE );
        !           108:     SendMessage(hwndName, EM_LIMITTEXT, MAX_FILENAME_SIZE - 1, 0);
        !           109: 
        !           110:     ShowWindow(hwndApp,cmdShow);
        !           111: 
        !           112:     /* Add about dialog to system menu.
        !           113:      */
        !           114:     AppendMenu(GetSystemMenu(hwndApp, 0),
        !           115:         MF_STRING | MF_ENABLED, IDM_ABOUT, "About Reverse...");
        !           116: 
        !           117: 
        !           118:   /* The main message processing loop. Nothing special here.
        !           119:    */
        !           120:   while (GetMessage(&msg,NULL,0,0))
        !           121:   {
        !           122:       TranslateMessage(&msg);
        !           123:       DispatchMessage(&msg);
        !           124:   }
        !           125: 
        !           126:   return msg.wParam;
        !           127: }
        !           128: 
        !           129: 
        !           130: /* WndProc - Main window procedure function.
        !           131:  */
        !           132: LONG FAR PASCAL WndProc(HWND hWnd, unsigned msg, UINT wParam, LONG lParam)
        !           133: {
        !           134:     FARPROC fpfn;
        !           135:     LPWAVEINST lpWaveInst;
        !           136: 
        !           137:     switch (msg)
        !           138:     {
        !           139:     case WM_DESTROY:
        !           140:         if (hWaveOut)
        !           141:        {
        !           142:           waveOutReset(hWaveOut);      
        !           143:            waveOutUnprepareHeader(hWaveOut, lpWaveHdr, sizeof(WAVEHDR) );
        !           144:            lpWaveInst = (LPWAVEINST) lpWaveHdr->dwUser;
        !           145:           cleanup(lpWaveInst);
        !           146:            waveOutClose(hWaveOut);     
        !           147:         }
        !           148:         PostQuitMessage(0);
        !           149:         break;
        !           150: 
        !           151:     case WM_SYSCOMMAND:
        !           152:         switch (LOWORD(wParam))
        !           153:         {
        !           154:         case IDM_ABOUT:
        !           155:             /* Show ABOUTBOX dialog box.
        !           156:              */
        !           157:             fpfn = MakeProcInstance((FARPROC)AppAbout, hInstApp);  // no op in 32 bit
        !           158:             DialogBox(hInstApp, "ABOUTBOX", hWnd, (DLGPROC)fpfn);
        !           159:             FreeProcInstance(fpfn);
        !           160:             break;
        !           161:         }
        !           162:         break;
        !           163: 
        !           164:     /* Process messages sent by the child window controls.
        !           165:      */
        !           166:     case WM_SETFOCUS:
        !           167:         SetFocus(hwndName);
        !           168:         return 0;
        !           169: 
        !           170:     case WM_COMMAND:
        !           171:         switch (LOWORD(wParam))
        !           172:         {
        !           173:         case IDE_NAME:              // filename edit control
        !           174:             return( 0L );
        !           175: 
        !           176:         case IDB_PLAY:              // "Play" button
        !           177:             if (HIWORD(wParam) == BN_CLICKED)
        !           178:                 ReversePlay();
        !           179:             break;
        !           180: 
        !           181:         case IDB_QUIT:              // "Exit" button
        !           182:             if (HIWORD(wParam) == BN_CLICKED)
        !           183:                 PostQuitMessage(0);
        !           184:             break;
        !           185:         }
        !           186:         return( 0L );
        !           187: 
        !           188:     case MM_WOM_DONE:
        !           189:         /* This message indicates a waveform data block has
        !           190:          * been played and can be freed. Clean up the preparation
        !           191:          * done previously on the header.
        !           192:          */
        !           193:         waveOutUnprepareHeader( (HWAVEOUT) wParam,
        !           194:                                 (LPWAVEHDR) lParam, sizeof(WAVEHDR) );
        !           195: 
        !           196:         /* Get a pointer to the instance data, then unlock and free
        !           197:          * all memory associated with the data block, including the
        !           198:          * memory for the instance data itself.
        !           199:          */
        !           200:         lpWaveInst = (LPWAVEINST) ((LPWAVEHDR)lParam)->dwUser;
        !           201:        cleanup(lpWaveInst);
        !           202:         /* Close the waveform output device.
        !           203:          */
        !           204:         waveOutClose( (HWAVEOUT) wParam );
        !           205: 
        !           206:         /* Reenable both button controls.
        !           207:          */
        !           208:         EnableWindow( hwndPlay, TRUE );
        !           209:         EnableWindow( hwndQuit, TRUE );
        !           210:         SetFocus(hwndName);
        !           211: 
        !           212:         break;
        !           213:     }
        !           214: 
        !           215:     return DefWindowProc(hWnd,msg,wParam,lParam);
        !           216: }
        !           217: 
        !           218: 
        !           219: /* AppAbout -- Dialog procedure for ABOUTBOX  dialog box.
        !           220:  */
        !           221: BOOL FAR PASCAL AppAbout(HWND hDlg, unsigned msg, unsigned wParam, LONG lParam)
        !           222: {
        !           223:     switch (msg)
        !           224:     {
        !           225:     case WM_COMMAND:
        !           226:         if (LOWORD(wParam) == IDOK)
        !           227:             EndDialog(hDlg,TRUE);
        !           228:         break;
        !           229: 
        !           230:     case WM_INITDIALOG:
        !           231:         return TRUE;
        !           232:     }
        !           233:     return FALSE;
        !           234: }
        !           235: 
        !           236: /* ReversePlay - Gets a filename from the edit control, then uses
        !           237:  *  the multimedia file I/O services to read data from the requested
        !           238:  *  WAVE file. If the file is a proper WAVE file, ReversePlay() calls
        !           239:  *  the Interchange() function to reverse the order of the waveform
        !           240:  *  samples in the file. It then plays the reversed waveform data.
        !           241:  *
        !           242:  *  Note that ReversePlay() only handles a single waveform data block.
        !           243:  *  If the requested WAVE file will not fit in a single data block, it
        !           244:  *  will not be played. The size of a single data block depends on the
        !           245:  *  amount of available system memory.
        !           246:  *
        !           247:  * Params:  void
        !           248:  *
        !           249:  * Return:  void
        !           250:  */
        !           251: void ReversePlay()
        !           252: {
        !           253:     HANDLE          hWaveHdr;
        !           254:     LPWAVEINST      lpWaveInst;
        !           255:     HMMIO           hmmio;
        !           256:     MMCKINFO        mmckinfoParent;
        !           257:     MMCKINFO        mmckinfoSubchunk;
        !           258:     DWORD           dwFmtSize;
        !           259:     char            szFileName[ MAX_FILENAME_SIZE ];
        !           260:     HANDLE          hFormat;
        !           261:     WAVEFORMAT      *pFormat;
        !           262:     DWORD           dwDataSize;
        !           263:     HPSTR           hpch1, hpch2;
        !           264:     WORD            wBlockSize;
        !           265:     HANDLE          hWaveInst;
        !           266:     HANDLE          hData       = NULL;
        !           267:     HPSTR           lpData      = NULL;
        !           268: 
        !           269:     /* Get the filename from the edit control.
        !           270:      */
        !           271:     if (!GetWindowText( hwndName, (LPSTR)szFileName, MAX_FILENAME_SIZE))
        !           272:     {
        !           273:         MessageBox(hwndApp, "Failed to Get Filename",
        !           274:                    NULL, MB_OK | MB_ICONEXCLAMATION);
        !           275:         return;
        !           276:     }
        !           277: 
        !           278:     /* Open the given file for reading using buffered I/O.
        !           279:      */
        !           280:     if(!(hmmio = mmioOpen(szFileName, NULL, MMIO_READ | MMIO_ALLOCBUF)))
        !           281:     {
        !           282:         MessageBox(hwndApp, "Failed to open file.",
        !           283:                    NULL, MB_OK | MB_ICONEXCLAMATION);
        !           284:         return;
        !           285:     }
        !           286: 
        !           287:     /* Locate a 'RIFF' chunk with a 'WAVE' form type
        !           288:      * to make sure it's a WAVE file.
        !           289:      */
        !           290:     mmckinfoParent.fccType = mmioFOURCC('W', 'A', 'V', 'E');
        !           291:     if (mmioDescend(hmmio, (LPMMCKINFO) &mmckinfoParent, NULL, MMIO_FINDRIFF))
        !           292:     {
        !           293:         MessageBox(hwndApp, "This is not a WAVE file.",
        !           294:                    NULL, MB_OK | MB_ICONEXCLAMATION);
        !           295:         mmioClose(hmmio, 0);
        !           296:         return;
        !           297:     }
        !           298: 
        !           299:     /* Now, find the format chunk (form type 'fmt '). It should be
        !           300:      * a subchunk of the 'RIFF' parent chunk.
        !           301:      */
        !           302:     mmckinfoSubchunk.ckid = mmioFOURCC('f', 'm', 't', ' ');
        !           303:     if (mmioDescend(hmmio, &mmckinfoSubchunk, &mmckinfoParent,
        !           304:         MMIO_FINDCHUNK))
        !           305:     {
        !           306:         MessageBox(hwndApp, "WAVE file is corrupted.",
        !           307:                    NULL, MB_OK | MB_ICONEXCLAMATION);
        !           308:         mmioClose(hmmio, 0);
        !           309:         return;
        !           310:     }
        !           311: 
        !           312:     /* Get the size of the format chunk, allocate and lock memory for it.
        !           313:      */
        !           314:     dwFmtSize = mmckinfoSubchunk.cksize;
        !           315:     hFormat = LocalAlloc(LMEM_MOVEABLE, LOWORD(dwFmtSize));
        !           316:     if (!hFormat)
        !           317:     {
        !           318:         MessageBox(hwndApp, "Out of memory.",
        !           319:                    NULL, MB_OK | MB_ICONEXCLAMATION);
        !           320:         mmioClose(hmmio, 0);
        !           321:         return;
        !           322:     }
        !           323:     pFormat = (WAVEFORMAT *) LocalLock(hFormat);
        !           324:     if (!pFormat)
        !           325:     {
        !           326:         MessageBox(hwndApp, "Failed to lock memory for format chunk.",
        !           327:                    NULL, MB_OK | MB_ICONEXCLAMATION);
        !           328:         LocalFree( hFormat );
        !           329:         mmioClose(hmmio, 0);
        !           330:         return;
        !           331:     }
        !           332: 
        !           333:     /* Read the format chunk.
        !           334:      */
        !           335:     if (mmioRead(hmmio, (HPSTR) pFormat, dwFmtSize) != (LONG) dwFmtSize)
        !           336:     {
        !           337:         MessageBox(hwndApp, "Failed to read format chunk.",
        !           338:                    NULL, MB_OK | MB_ICONEXCLAMATION);
        !           339:         LocalUnlock( hFormat );
        !           340:         LocalFree( hFormat );
        !           341:         mmioClose(hmmio, 0);
        !           342:         return;
        !           343:     }
        !           344: 
        !           345:     /* Make sure it's a PCM file.
        !           346:      */
        !           347:     if (pFormat->wFormatTag != WAVE_FORMAT_PCM)
        !           348:     {
        !           349:         LocalUnlock( hFormat );
        !           350:         LocalFree( hFormat );
        !           351:         mmioClose(hmmio, 0);
        !           352:         MessageBox(hwndApp, "The file is not a PCM file.",
        !           353:                    NULL, MB_OK | MB_ICONEXCLAMATION);
        !           354:         return;
        !           355:     }
        !           356: 
        !           357:     /* Make sure a waveform output device supports this format.
        !           358:      */
        !           359:     if (waveOutOpen(&hWaveOut, WAVE_MAPPER, (LPWAVEFORMAT)pFormat, 0L, 0L,
        !           360:                     WAVE_FORMAT_QUERY))
        !           361:     {
        !           362:         LocalUnlock( hFormat );
        !           363:         LocalFree( hFormat );
        !           364:         mmioClose(hmmio, 0);
        !           365:         MessageBox(hwndApp, "The waveform device can't play this format.",
        !           366:                    NULL, MB_OK | MB_ICONEXCLAMATION);
        !           367:         return;
        !           368:     }
        !           369: 
        !           370:     /* Ascend out of the format subchunk.
        !           371:      */
        !           372:     mmioAscend(hmmio, &mmckinfoSubchunk, 0);
        !           373: 
        !           374:     /* Find the data subchunk.
        !           375:      */
        !           376:     mmckinfoSubchunk.ckid = mmioFOURCC('d', 'a', 't', 'a');
        !           377:     if (mmioDescend(hmmio, &mmckinfoSubchunk, &mmckinfoParent,
        !           378:         MMIO_FINDCHUNK))
        !           379:     {
        !           380:         MessageBox(hwndApp, "WAVE file has no data chunk.",
        !           381:                    NULL, MB_OK | MB_ICONEXCLAMATION);
        !           382:         LocalUnlock( hFormat );
        !           383:         LocalFree( hFormat );
        !           384:         mmioClose(hmmio, 0);
        !           385:         return;
        !           386:     }
        !           387: 
        !           388:     /* Get the size of the data subchunk.
        !           389:      */
        !           390:     dwDataSize = mmckinfoSubchunk.cksize;
        !           391:     if (dwDataSize == 0L)
        !           392:     {
        !           393:         MessageBox(hwndApp, "The data chunk has no data.",
        !           394:                    NULL, MB_OK | MB_ICONEXCLAMATION);
        !           395:         LocalUnlock( hFormat );
        !           396:         LocalFree( hFormat );
        !           397:         mmioClose(hmmio, 0);
        !           398:         return;
        !           399:     }
        !           400: 
        !           401:     /* Open a waveform output device.
        !           402:      */
        !           403:     if (waveOutOpen((LPHWAVEOUT)&hWaveOut, WAVE_MAPPER,
        !           404:                   (LPWAVEFORMAT)pFormat, (UINT)hwndApp, 0L, CALLBACK_WINDOW))
        !           405:     {
        !           406:         MessageBox(hwndApp, "Failed to open waveform output device.",
        !           407:                    NULL, MB_OK | MB_ICONEXCLAMATION);
        !           408:         LocalUnlock( hFormat );
        !           409:         LocalFree( hFormat );
        !           410:         mmioClose(hmmio, 0);
        !           411:         return;
        !           412:     }
        !           413: 
        !           414:     /* Save block alignment info for later use.
        !           415:      */
        !           416:     wBlockSize = pFormat->nBlockAlign;
        !           417: 
        !           418:     /* We're done with the format header, free it.
        !           419:      */
        !           420:     LocalUnlock( hFormat );
        !           421:     LocalFree( hFormat );
        !           422: 
        !           423:     /* Allocate and lock memory for the waveform data.
        !           424:      */
        !           425:     hData = GlobalAlloc(GMEM_MOVEABLE , dwDataSize );
        !           426:                        /* GMEM_SHARE is not needed on 32 bits */
        !           427:     if (!hData)
        !           428:     {
        !           429:         MessageBox(hwndApp, "Out of memory.",
        !           430:                    NULL, MB_OK | MB_ICONEXCLAMATION);
        !           431:         mmioClose(hmmio, 0);
        !           432:         return;
        !           433:     }
        !           434:     lpData = GlobalLock(hData);
        !           435:     if (!lpData)
        !           436:     {
        !           437:         MessageBox(hwndApp, "Failed to lock memory for data chunk.",
        !           438:                    NULL, MB_OK | MB_ICONEXCLAMATION);
        !           439:         GlobalFree( hData );
        !           440:         mmioClose(hmmio, 0);
        !           441:         return;
        !           442:     }
        !           443: 
        !           444:     /* Read the waveform data subchunk.
        !           445:      */
        !           446:     if(mmioRead(hmmio, (HPSTR) lpData, dwDataSize) != (LONG) dwDataSize)
        !           447:     {
        !           448:         MessageBox(hwndApp, "Failed to read data chunk.",
        !           449:                    NULL, MB_OK | MB_ICONEXCLAMATION);
        !           450:         GlobalUnlock( hData );
        !           451:         GlobalFree( hData );
        !           452:         mmioClose(hmmio, 0);
        !           453:         return;
        !           454:     }
        !           455: 
        !           456:     /* We're done with the file, close it.
        !           457:      */
        !           458:     mmioClose(hmmio, 0);
        !           459: 
        !           460:     /* Reverse the sound for playing.
        !           461:      */
        !           462:     hpch1 = lpData;
        !           463:     hpch2 = lpData + dwDataSize - 1;
        !           464:     while (hpch1 < hpch2)
        !           465:     {
        !           466:         Interchange( hpch1, hpch2, wBlockSize );
        !           467:         hpch1 += wBlockSize;
        !           468:         hpch2 -= wBlockSize;
        !           469:     }
        !           470: 
        !           471:     /* Allocate a waveform data header. The WAVEHDR must be
        !           472:      * globally allocated and locked.
        !           473:      */
        !           474:     hWaveHdr = GlobalAlloc(GMEM_MOVEABLE, (DWORD) sizeof(WAVEHDR));
        !           475:     if (!hWaveHdr)
        !           476:     {
        !           477:         GlobalUnlock( hData );
        !           478:         GlobalFree( hData );
        !           479:         MessageBox(hwndApp, "Not enough memory for header.",
        !           480:                    NULL, MB_OK | MB_ICONEXCLAMATION);
        !           481:         return;
        !           482:     }
        !           483:     lpWaveHdr = (LPWAVEHDR) GlobalLock(hWaveHdr);
        !           484:     if (!lpWaveHdr)
        !           485:     {
        !           486:         GlobalUnlock( hData );
        !           487:         GlobalFree( hData );
        !           488:         GlobalFree( hWaveHdr );
        !           489:         MessageBox(hwndApp, "Failed to lock memory for header.",
        !           490:                    NULL, MB_OK | MB_ICONEXCLAMATION);
        !           491:         return;
        !           492:     }
        !           493: 
        !           494:     /* Allocate and set up instance data for waveform data block.
        !           495:      * This information is needed by the routine that frees the
        !           496:      * data block after it has been played.
        !           497:      */
        !           498:     hWaveInst = GlobalAlloc(GMEM_MOVEABLE, (DWORD) sizeof(WAVEHDR));
        !           499:     if (!hWaveInst)
        !           500:     {
        !           501:         GlobalUnlock( hData );
        !           502:         GlobalFree( hData );
        !           503:         GlobalUnlock( hWaveHdr );
        !           504:         GlobalFree( hWaveHdr );
        !           505:         MessageBox(hwndApp, "Not enough memory for instance data.",
        !           506:                    NULL, MB_OK | MB_ICONEXCLAMATION);
        !           507:         return;
        !           508:     }
        !           509:     lpWaveInst = (LPWAVEINST) GlobalLock(hWaveInst);
        !           510:     if (!lpWaveInst)
        !           511:     {
        !           512:         GlobalUnlock( hData );
        !           513:         GlobalFree( hData );
        !           514:         GlobalUnlock( hWaveHdr );
        !           515:         GlobalFree( hWaveHdr );
        !           516:         GlobalFree( hWaveInst );
        !           517:         MessageBox(hwndApp, "Failed to lock memory for instance data.",
        !           518:                    NULL, MB_OK | MB_ICONEXCLAMATION);
        !           519:         return;
        !           520:     }
        !           521:     lpWaveInst->hWaveInst = hWaveInst;
        !           522:     lpWaveInst->hWaveHdr = hWaveHdr;
        !           523:     lpWaveInst->hWaveData = hData;
        !           524: 
        !           525:     /* Set up WAVEHDR structure and prepare it to be written to wave device.
        !           526:      */
        !           527:     lpWaveHdr->lpData = lpData;
        !           528:     lpWaveHdr->dwBufferLength = dwDataSize;
        !           529:     lpWaveHdr->dwFlags = 0L;
        !           530:     lpWaveHdr->dwLoops = 0L;
        !           531:     lpWaveHdr->dwUser = (DWORD) lpWaveInst;
        !           532:     if(waveOutPrepareHeader(hWaveOut, lpWaveHdr, sizeof(WAVEHDR)))
        !           533:     {
        !           534:         GlobalUnlock( hData );
        !           535:         GlobalFree( hData );
        !           536:         GlobalUnlock( hWaveHdr );
        !           537:         GlobalFree( hWaveHdr );
        !           538:         GlobalUnlock( hWaveInst );
        !           539:         GlobalFree( hWaveInst );
        !           540:         MessageBox(hwndApp, "Unable to prepare wave header.",
        !           541:                    NULL, MB_OK | MB_ICONEXCLAMATION);
        !           542: 
        !           543:         return;
        !           544:     }
        !           545: 
        !           546:     /* Then the data block can be sent to the output device.
        !           547:      */
        !           548:     {   MMRESULT        mmResult;
        !           549:         mmResult = waveOutWrite(hWaveOut, lpWaveHdr, sizeof(WAVEHDR));
        !           550:         if (mmResult != 0)
        !           551:         {
        !           552:             waveOutUnprepareHeader( hWaveOut, lpWaveHdr, sizeof(WAVEHDR));
        !           553:             GlobalUnlock( hData );
        !           554:             GlobalFree( hData );
        !           555:             MessageBox(hwndApp, "Failed to write block to device",
        !           556:                        NULL, MB_OK | MB_ICONEXCLAMATION);
        !           557:             return;
        !           558:         }
        !           559:     }
        !           560: 
        !           561:     /* Disable input to the button controls.
        !           562:      */
        !           563:     EnableWindow(hwndPlay, FALSE);
        !           564:     EnableWindow(hwndQuit, FALSE);
        !           565: }
        !           566: 
        !           567: /* Interchange - Interchanges two samples at the given positions.
        !           568:  *
        !           569:  * Params:  hpchPos1 - Points to one sample.
        !           570:  *          hpchPos2 - Points to the other sample.
        !           571:  *          wLength  - The length of a sample in bytes.
        !           572:  *
        !           573:  * Return:  void
        !           574:  */
        !           575: void Interchange(HPSTR hpchPos1, HPSTR hpchPos2, unsigned uLength)
        !           576: {
        !           577:     unsigned    uPlace;
        !           578:     BYTE    bTemp;
        !           579: 
        !           580:     for (uPlace = 0; uPlace < uLength; uPlace++)
        !           581:     {
        !           582:         bTemp = hpchPos1[uPlace];
        !           583:         hpchPos1[uPlace] = hpchPos2[uPlace];
        !           584:         hpchPos2[uPlace] = bTemp;
        !           585:     }
        !           586: }
        !           587: 
        !           588: VOID cleanup(LPWAVEINST lpWaveInst)
        !           589: {
        !           590:     GlobalUnlock( lpWaveInst->hWaveData );
        !           591:     GlobalFree( lpWaveInst->hWaveData );
        !           592:     GlobalUnlock( lpWaveInst->hWaveHdr );
        !           593:     GlobalFree( lpWaveInst->hWaveHdr );
        !           594:     GlobalUnlock( lpWaveInst->hWaveInst );
        !           595:     GlobalFree( lpWaveInst->hWaveInst );
        !           596: }

unix.superglobalmegacorp.com

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