// Drop-in replacement for id_sd.c:alOut void BE_ST_ALOut(uint8_t reg,uint8_t val) { BE_ST_LockAudioRecursively(); // RECURSIVE lock // FIXME: The original code for alOut adds 6 reads of the // register port after writing to it (3.3 microseconds), and // then 35 more reads of register port after writing to the // data port (23 microseconds). // // It is apparently important for a portion of the fuse // breakage sound at the least. For now a hack is implied. YM3812Write(&oplChip, reg, val); // Hack comes with a "magic number" // that appears to make it work better unsigned int length = OPL_SAMPLE_RATE / 10000; if (length > OPL_NUM_OF_SAMPLES - g_sdlALOutSamplesEnd) { BE_Cross_LogMessage(BE_LOG_MSG_WARNING, "BE_ST_ALOut overflow, want %u, have %u\n", length, OPL_NUM_OF_SAMPLES - g_sdlALOutSamplesEnd); // FIXME - Other thread length = OPL_NUM_OF_SAMPLES - g_sdlALOutSamplesEnd; } if (length) { YM3812UpdateOne(&oplChip, &g_sdlALOutSamples[g_sdlALOutSamplesEnd], length); g_sdlALOutSamplesEnd += length; } BE_ST_UnlockAudioRecursively(); // RECURSIVE unlock }
/////////////////////////////////////////////////////////////////////////// // // SDL_PCService() - Handles playing the next sample in a PC sound // /////////////////////////////////////////////////////////////////////////// static void SDL_PCService(void) { id0_byte_t s; id0_word_t t; if (pcSound) { s = *pcSound++; if (s != pcLastSample) { BE_ST_LockAudioRecursively(); // asm pushf // asm cli pcLastSample = s; if (s) // We have a frequency! { t = pcSoundLookup[s]; BE_ST_PCSpeakerOn(t); #if 0 asm mov bx,[t] asm mov al,0xb6 // Write to channel 2 (speaker) timer asm out 43h,al asm mov al,bl asm out 42h,al // Low byte asm mov al,bh asm out 42h,al // High byte asm in al,0x61 // Turn the speaker & gate on asm or al,3 asm out 0x61,al #endif } else // Time for some silence { BE_ST_PCSpeakerOff(); #if 0 asm in al,0x61 // Turn the speaker & gate off asm and al,0xfc // ~3 asm out 0x61,al #endif } BE_ST_UnlockAudioRecursively(); // asm popf }
void #else static void #endif SDL_PCPlaySound(PCSound id0_far *sound) { BE_ST_LockAudioRecursively(); //asm pushf //asm cli pcLastSample = -1; pcLengthLeft = sound->common.length; pcSound = sound->data; BE_ST_UnlockAudioRecursively(); //asm popf }
void #else static void #endif SDL_PCStopSound(void) { BE_ST_LockAudioRecursively(); //asm pushf //asm cli pcSound = 0; BE_ST_PCSpeakerOff(); #if 0 asm in al,0x61 // Turn the speaker off asm and al,0xfd // ~2 asm out 0x61,al #endif BE_ST_UnlockAudioRecursively(); //asm popf }
void BE_ST_BNoSound(void) { BE_ST_LockAudioRecursively(); BE_ST_PCSpeakerOff(); BE_ST_UnlockAudioRecursively(); }
void BE_ST_BSound(uint16_t frequency) { BE_ST_LockAudioRecursively(); BE_ST_PCSpeakerOn(PC_PIT_RATE/(uint32_t)frequency); BE_ST_UnlockAudioRecursively(); }