windows-nt/Source/XPSP1/NT/base/mvdm/vdd/vsndblst/mixer.c

207 lines
4.2 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
/***************************************************************************
*
* 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 <windows.h> // The VDD is a win32 DLL
#include <mmsystem.h> // Multi-media APIs
#include <vddsvc.h> // Definition of VDD calls
#include <vsb.h>
#include <mixer.h>
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);
}