#include "builddefines.h" #include "DEBUG.H" #include "types.h" //#include "mssw.h" #include "GAP.H" #include "Sound Control.h" #include "soundman.h" #include #include "FileMan.h" SUBSEQUENTSOUNDS subsequentsounds; void AudioGapListInit( CHAR8 *zSoundFile, AudioGapList *pGapList ) { // This procedure will load in the appropriate .gap file, corresponding // to the .wav file in szSoundEffects indexed by uiSampleNum // The procedure will then allocate and load in the AUDIO_GAP information, // while counting the number of elements loaded // FILE *pFile; HWFILE pFile; STR pSourceFileName; STR pDestFileName; char sFileName[256]; UINT8 counter=0; AUDIO_GAP *pCurrentGap, *pPreviousGap; UINT32 Start; UINT32 uiNumBytesRead; UINT32 End; pSourceFileName= zSoundFile; pDestFileName=sFileName; //Initialize GapList pGapList->size=0; pGapList->current_time=0; pGapList->pHead=0; pGapList->pCurrent=0; pGapList->audio_gap_active=FALSE; pPreviousGap=pCurrentGap=0; //DebugMsg(TOPIC_JA2, DBG_LEVEL_3,String("File is %s", szSoundEffects[uiSampleNum])); // Get filename strcpy(pDestFileName, pSourceFileName); // strip .wav and change to .gap while(pDestFileName[counter] !='.') { counter++; } pDestFileName[counter+1]='g'; pDestFileName[counter+2]='a'; pDestFileName[counter+3]='p'; pDestFileName[counter+4]='\0'; if(!FileExists(pDestFileName))//dnl ch79 291113 return; pFile = FileOpen(pDestFileName, FILE_ACCESS_READ, FALSE ); if( pFile ) { counter=0; // gap file exists // now read in the AUDIO_GAPs //fread(&Start,sizeof(UINT32), 1, pFile); FileRead( pFile, &Start,sizeof(UINT32), &uiNumBytesRead ); // while ( !feof(pFile) ) while ( !FileCheckEndOfFile( pFile ) ) { // can read the first element, there exists a second //fread(&End, sizeof(UINT32),1,pFile); FileRead( pFile, &End, sizeof(UINT32), &uiNumBytesRead ); // allocate space for AUDIO_GAP pCurrentGap = (AUDIO_GAP *)MemAlloc( sizeof(AUDIO_GAP) ); if (pPreviousGap !=0) pPreviousGap->pNext=pCurrentGap; else { // Start of list pGapList->pCurrent=pCurrentGap; pGapList->pHead=pCurrentGap; } pGapList->size++; pCurrentGap->pNext=0; pCurrentGap->uiStart=Start; pCurrentGap->uiEnd=End; DebugMsg( TOPIC_JA2, DBG_LEVEL_3, String("Gap Start %d and Ends %d", Start, End) ); // Increment pointer pPreviousGap=pCurrentGap; // fread(&Start,sizeof(UINT32), 1, pFile); FileRead( pFile, &Start, sizeof(UINT32), &uiNumBytesRead ); } pGapList->audio_gap_active=FALSE; pGapList->current_time=0; //fclose(pFile); FileClose( pFile ); } DebugMsg( TOPIC_JA2, DBG_LEVEL_3, String("Gap List Started From File %s and has %d gaps", pDestFileName, pGapList->size) ); } void AudioGapListDone( AudioGapList *pGapList ) { // This procedure will go through the AudioGapList and free space/nullify pointers // for any allocated elements AUDIO_GAP *pCurrent, *pNext; if (pGapList->pHead !=0) { pCurrent=pGapList->pHead; pNext=pCurrent->pNext; // There are elements in the list while(pNext !=0) { // kill pCurrent MemFree(pCurrent); pCurrent=pNext; pNext=pNext->pNext; } // now kill the last element MemFree(pCurrent); pCurrent=0; } pGapList->pHead=0; pGapList->pCurrent=0; pGapList->size = 0; DebugMsg( TOPIC_JA2, DBG_LEVEL_3, String("Audio Gap List Deleted") ); } void PollAudioGap( UINT32 uiSampleNum, AudioGapList *pGapList ) { // This procedure will access the AudioGapList pertaining to the .wav about // to be played and sets the audio_gap_active flag. This is done by // going to the current AUDIO_GAP element in the AudioGapList, comparing to see if // the current time is between the uiStart and uiEnd. If so, set flag..if not and // the uiStart of the next element is not greater than current time, set current to next and repeat // ...if next elements uiStart is larger than current_time, or no more elements.. // set flag FALSE UINT32 time; AUDIO_GAP *pCurrent; if(!pGapList) { // no gap list, return return; } if (pGapList->size > 0) { time=SoundGetPosition(uiSampleNum); // DebugMsg( TOPIC_JA2, DBG_LEVEL_3, String("Sound Sample Time is %d", time) ); } else { pGapList->audio_gap_active=(FALSE); return; } // set current ot head of gap list for this sound pCurrent = pGapList->pHead; // check to see if we have fallen behind if( ( time > pCurrent->uiEnd ) ) { // fallen behind // catchup while( time > pCurrent->uiEnd ) { pCurrent = pCurrent->pNext; if( ! pCurrent ) { pGapList->audio_gap_active=(FALSE); return; } } } // check to see if time is within the next AUDIO_GAPs start time if ( ( time > pCurrent->uiStart ) && ( time < pCurrent->uiEnd ) ) { if ((time >pCurrent->uiStart)&&(time < pCurrent->uiEnd)) { // we are within the time frame DebugMsg( TOPIC_JA2, DBG_LEVEL_3, String("Gap Started at %d", time) ); pGapList->audio_gap_active=(TRUE); } else if ( (time > pCurrent->uiEnd)&&(pGapList->audio_gap_active == TRUE) ) { // reset if already set pGapList->audio_gap_active=(FALSE); DebugMsg( TOPIC_JA2, DBG_LEVEL_3, String("Gap Ended at %d", time) ); } } else { pGapList->audio_gap_active=(FALSE); } } UINT32 PlayJA2GapSample( CHAR8 *zSoundFile, UINT32 usRate, UINT32 ubVolume, UINT32 ubLoops, UINT32 uiPan, AudioGapList* pData ) { SOUNDPARMS spParms; memset(&spParms, 0xff, sizeof(SOUNDPARMS)); spParms.uiSpeed = usRate; spParms.uiVolume = (UINT32) ( ( ubVolume / (FLOAT) HIGHVOLUME ) * GetSpeechVolume( ) ); spParms.uiLoop = ubLoops; spParms.uiPan = uiPan; spParms.uiPriority=GROUP_PLAYER; // Setup Gap Detection, if it is not null if( pData != NULL ) AudioGapListInit( zSoundFile, pData ); return(SoundPlayStreamedFile( zSoundFile, &spParms)); } // anv: for playing multiple sounds in row (with one text) UINT32 PlayJA2MultipleGapSample( CHAR8 zSoundFiles[][64], UINT8 ubSoundsCount, UINT32 usRate, UINT32 ubVolume, UINT32 ubLoops, UINT32 uiPan, AudioGapList* pData ) { SOUNDPARMS spParms; memset(&spParms, 0xff, sizeof(SOUNDPARMS)); spParms.uiSpeed = usRate; spParms.uiVolume = (UINT32) ( ( ubVolume / (FLOAT) HIGHVOLUME ) * GetSpeechVolume( ) ); spParms.uiLoop = ubLoops; spParms.uiPan = uiPan; spParms.uiPriority=GROUP_PLAYER; subsequentsounds.ubSndCounter = 1; subsequentsounds.ubMaxSndCounter = ubSoundsCount; for( UINT8 i = 0; i < ubSoundsCount; i++ ) { strcpy(subsequentsounds.zSoundFiles[i], zSoundFiles[i]); } subsequentsounds.spParams = spParms; // Setup Gap Detection, if it is not null if( pData != NULL ) AudioGapListInit( zSoundFiles[0], pData ); return( SoundPlayStreamedFile( zSoundFiles[0], &spParms)); // rest of sounds (if there are any) will be called from HandleTalkingAutoFace when current one ends }