/****************************************************************/ /* */ /* Digitized Voice Programmer's Toolkit */ /* ------------------------------------ */ /* */ /* Example of a program which plays voice data */ /* from a file of unlimited length */ /* */ /* Copyright (c) 1989, Farpoint Software */ /* */ /* */ /* This program simply plays a voice message while displaying */ /* a message repeatedly indicating the count of bytes played. */ /* The digitized voice data is read from a disk file piece by */ /* piece while the playback is in progress. The memory buffer */ /* used is much smaller than the potential file size. Data is */ /* read from the buffer with the pointer wrapping back to the */ /* beginning of the buffer upon reaching the end. The routine */ /* PVOICE_CATCHUP (source in VPMOD.ASM) transfers data from */ /* the file to the buffer in the same way. */ /* */ /****************************************************************/ #include "vpmod.h" #include #include #include #include #include #include #include #include #include #define buf_size 16384L char filename[128]; char huge *buffer; int handle; main(argc,argv) int argc; char **argv; { short retval; long count,index; /* check for one argument on command line */ if (argc != 2) { printf("Include file name on command line.\n"); exit(1); } argv++; strcpy(filename,*argv); /* open the file */ handle = open(filename,O_BINARY|O_RDONLY); if (handle == -1) { printf("Error opening file.\n"); exit(1); } /* allocate memory for the buffer */ buffer = (char huge *)halloc(buf_size,1); if (buffer == NULL) { close(handle); printf("Unable to allocate buffer memory.\n"); exit(1); } /* get ready */ PVOICE_INIT(); /* start the playback */ retval = PVOICE_START(buffer,(long)buf_size,1,handle,filelength(handle),0L); /* test return code for success or failure */ switch (retval) { case 0: printf("Voice playback has begun.\n"); break; case 1: case 2: printf("Buffer sizing error.\n"); break; case 3: printf("File read error.\n"); } if (!retval) { /* loop while waiting for the process to complete */ while (PVOICE_STATUS(&count,&index)) { /* If PVOICE_CATCHUP returns non-zero then file read error. */ /* PVOICE_CATCHUP has to be called frequently during playback */ /* in order to keep reading the file and keep the data in */ /* the buffer current. */ if (PVOICE_CATCHUP()) { printf("File read error.\n"); break; } else /* just something to do in the foreground */ printf("Number of bytes played = %ld\n",count); /* check the keystroke buffer */ if (_bios_keybrd(_KEYBRD_READY)) { /* keystroke found, test for key */ if ( (_bios_keybrd(_KEYBRD_READ) >> 8) == 0x01 ) { PVOICE_STOP(); printf("Voice playback stopped with \n"); break; } } } } /* do this before exiting or suffer the consequences */ PVOICE_CLEANUP(); /* close the file and free the allocated memory */ close(handle); free(buffer); }