/*************************************************************************** * * mixer.c * * Copyright (c) 1991-1996 Microsoft Corporation. All Rights Reserved. * * This code provides VDD support for SB 2.0 sound output, specifically: * Mixer Chip CT1335 (not strictly part of SB 2.0, but apps seem to like it) * ***************************************************************************/ /***************************************************************************** * * #includes * *****************************************************************************/ #include // The VDD is a win32 DLL #include // Multi-media APIs #include // Definition of VDD calls #include #include extern SETVOLUMEPROC SetVolumeProc; extern HWAVEOUT HWaveOut; // the current open wave output device /* * Mixer globals */ struct { BYTE MasterVolume; // current master volume BYTE FMVolume; // current volume of fm device BYTE CDVolume; // current volume of cd BYTE VoiceVolume; // current volume of wave device } MixerSettings; /* * Mixer State Machine */ enum { MixerReset = 1, // initial state and after reset MixerMasterVolume, MixerFMVolume, MixerCDVolume, MixerVoiceVolume } MixerState = MixerReset; // state of current command/data being set /**************************************************************************** * * Mixer device routines * ****************************************************************************/ VOID MixerDataRead( BYTE * data ) { switch(MixerState) { case MixerReset: ResetMixer(); break; case MixerMasterVolume: *data = MixerSettings.MasterVolume; break; case MixerFMVolume: *data = MixerSettings.FMVolume; break; case MixerCDVolume: *data = MixerSettings.CDVolume; break; case MixerVoiceVolume: *data = MixerSettings.VoiceVolume; break; } } VOID MixerAddrWrite( BYTE data ) { switch(data) { case MIXER_RESET: MixerState = MixerReset; break; case MIXER_MASTER_VOLUME: MixerState = MixerMasterVolume; break; case MIXER_FM_VOLUME: MixerState = MixerFMVolume; break; case MIXER_CD_VOLUME: MixerState = MixerCDVolume; break; case MIXER_VOICE_VOLUME: MixerState = MixerVoiceVolume; break; } } VOID MixerDataWrite( BYTE data ) { // only voice and master volume implemented, // havent't found any apps using others switch(MixerState) { case MixerReset: ResetMixer(); break; case MixerMasterVolume: MixerSettings.MasterVolume = data; MixerSetMasterVolume(data); break; case MixerFMVolume: MixerSettings.FMVolume = data; break; case MixerCDVolume: MixerSettings.CDVolume = data; break; case MixerVoiceVolume: MixerSettings.VoiceVolume = data; MixerSetVoiceVolume(data); break; } } /* * Reset the mixer to initial values. */ VOID ResetMixer( VOID ) { MixerSettings.MasterVolume = 0x08; // set to level 4 MixerSetMasterVolume(0x08); MixerSettings.FMVolume = 0x08; // set to level 4 MixerSettings.CDVolume = 0x00; // set to level 0 MixerSettings.VoiceVolume = 0x04; // set to level 2 MixerSetVoiceVolume(0x04); MixerState = MixerReset; } /***************************************************************************/ /* * Set master volume. */ VOID MixerSetMasterVolume( BYTE level ) { ULONG volume = 0; level = level >> 1; level = level & 0x07; volume = level*0x2492; // 0xFFFF/7 = 0x2492 volume = volume + (volume<<16); } /***************************************************************************/ /* * Set volume of wave out device. */ VOID MixerSetVoiceVolume( BYTE level ) { ULONG volume = 0; level = level >> 1; level = level & 0x03; volume = level*0x5555; // 0xFFFF/3 = 0x5555 volume = volume + (volume<<16); SetVolumeProc(HWaveOut, volume); }