#include <Debug.h>
#include "MSP3430.h"
enum MSP3430_register {
MSP3430_CONTROL = 0x00,
MSP3430_WR_DEM = 0x10,
MSP3430_RD_DEM = 0x11,
MSP3430_WR_DSP = 0x12,
MSP3430_RD_DSP = 0x13
};
enum MSP3430_control_register {
MSP3430_CONTROL_NORMAL = 0x0000,
MSP3430_CONTROL_RESET = 0x8000
};
enum MSP3430_wr_dem_register {
MSP3430_DEM_STANDARD_SEL = 0x0020,
MSP3430_DEM_MODUS = 0x0030,
MSP3430_DEM_I2S_CONFIG = 0x0040
};
enum MSP3430_rd_dem_register {
MSP3430_DEM_STANDARD_RES = 0x007e,
MSP3430_DEM_STATUS = 0x0200
};
enum MSP3430_wr_dsp_register {
MSP3430_DSP_FM_PRESCALE = 0x000e,
MSP3430_DSP_PRE_FM = BITS(15:8),
MSP3430_DSP_FM_MATRIX = BITS(7:0),
MSP3430_DSP_NICAM_PRESCALE = 0x0010,
MSP34300_DSP_PRE_NICAM = BITS(15:8),
MSP3430_DSP_PRE_I2S2 = 0x0012,
MSP3430_DSP_PRE_I2S1 = 0x0016,
MSP3430_DSP_PRE_SCART = 0x000d,
MSP3430_DSP_SRC_MAT_MAIN = 0x0008,
MSP3430_DSP_SRC_MAIN = BITS(15:8),
MSP3430_DSP_MAT_MAIN = BITS(7:0),
MSP3430_DSP_SRC_MAT_AUX = 0x0009,
MSP3430_DSP_SRC_AUX = BITS(15:8),
MSP3430_DSP_MAT_AUX = BITS(7:0),
MSP3430_DSP_SRC_MAT_SCART1 = 0x000a,
MSP3430_DSP_SRC_SCART1 = BITS(15:8),
MSP3430_DSP_MAT_SCART1 = BITS(7:0),
MSP3430_DSP_SRC_MAT_SCART2 = 0x0041,
MSP3430_DSP_SRC_SCART2 = BITS(15:8),
MSP3430_DSP_MAT_SCART2 = BITS(7:0),
MSP3430_DSP_SRC_MAT_I2S = 0x000b,
MSP3430_DSP_SRC_I2S = BITS(15:8),
MSP3430_DSP_MAT_I2S = BITS(7:0),
MSP3430_DSP_SRC_MAT_QPEAK = 0x000c,
MSP3430_DSP_SRC_QPEAK = BITS(15:8),
MSP3430_DSP_MAT_QPEAK = BITS(7:0),
MSP3430_DSP_VOL_MAIN = 0x0000,
MSP3430_DSP_VOL_AUX = 0x0006,
MSP3430_DSP_AVC = 0x0029,
MSP3430_DSP_BAL_MAIN = 0x0001,
MSP3430_DSP_BAL_AUX = 0x0030,
MSP3430_DSP_TONE_MODE = 0x0020,
MSP3430_DSP_BASS_MAIN = 0x0002,
MSP3430_DSP_BASS_AUX = 0x0031,
MSP3430_DSP_TREB_MAIN = 0x0003,
MSP3430_DSP_TREB_AUX = 0x0032,
MSP3430_DSP_EQUAL_BAND1 = 0x0021,
MSP3430_DSP_EQUAL_BAND2 = 0x0022,
MSP3430_DSP_EQUAL_BAND3 = 0x0023,
MSP3430_DSP_EQUAL_BAND4 = 0x0024,
MSP3430_DSP_EQUAL_BAND5 = 0x0025,
MSP3430_DSP_LOUD_MAIN = 0x0004,
MSP3430_DSP_LOUD_AUX = 0x0033,
MSP3430_DSP_SPAT_MAIN = 0x0005,
MSP3430_DSP_SUBW_LEVEL = 0x002c,
MSP3430_DSP_SUBW_FREQ = 0x002d,
MSP3430_DSP_MDB_STR = 0x0068,
MSP3430_DSP_MDB_LIM = 0x0069,
MSP3430_DSP_MDB_HMC = 0x006a,
MSP3430_DSP_MDB_LP = 0x006b,
MSP3430_DSP_MDB_HP = 0x006c,
MSP3430_DSP_VOL_SCART1 = 0x0007,
MSP3430_DSP_VOL_SCART2 = 0x0040,
MSP3430_DSP_ACB_REG = 0x0013,
MSP3430_DSP_BEEPER = 0x0014
};
enum MSP3430_rd_dsp_register {
MSP3430_DSP_QPEAK_L = 0x0019,
MSP3430_DSP_QPEAK_R = 0x001a,
MSP3430_DSP_MSP_HARD_REVISION = 0x001e,
MSP3430_DSP_MSP_HARD = BITS(15:8),
MSP3430_DSP_MSP_REVISION = BITS(7:0),
MSP3430_DSP_MSP_PRODUCT_ROM = 0x001f,
MSP3430_DSP_MSP_PRODUCT = BITS(15:8),
MSP3430_DSP_MSP_ROM = BITS(7:0)
};
enum MSP3430_sound_standard {
C_MSP3430_AUTOMATIC = 0x0001,
C_MSP3430_M_FM_STEREO = 0x0002,
C_MSP3430_BG_FM_STEREO = 0x0003,
C_MSP3430_DK1_FM_STEREO = 0x0004,
C_MSP3430_DK2_FM_STEREO = 0x0005,
C_MSP3430_DK_FM_MONO = 0x0006,
C_MSP3430_DK3_FM_STEREO = 0x0007,
C_MSP3430_BG_NICAM_FM = 0x0008,
C_MSP3430_L_NICAM_AM = 0x0009,
C_MSP3430_I_NICAM_FM = 0x000A,
C_MSP3430_DK_NICAM_FM = 0x000B,
C_MSP3430_DK_NICAM_FM_HDEV2 = 0x000C,
C_MSP3430_DK_NICAM_FM_HDEV3 = 0x000D,
C_MSP3430_BTSC_STEREO = 0x0020,
C_MSP3430_BTSC_MONO_SAP = 0x0021,
C_MSP3430_M_JAPAN_STEREO = 0x0030,
C_MSP3430_FM_RADIO = 0x0040,
C_MSP3430_SAT_MONO = 0x0050,
C_MSP3430_SAT_STEREO = 0x0051,
C_MSP3430_SAT_ASTRA_RADIO = 0x0060
};
enum MSP3430_channel_source {
C_MSP3430_SOURCE_FM = 0x00,
C_MSP3430_SOURCE_STEREO = 0x01,
C_MSP3430_SOURCE_SCART = 0x02,
C_MSP3430_SOURCE_LANG_A = 0x03,
C_MSP3430_SOURCE_LANG_B = 0x04,
C_MSP3430_SOURCE_I2S1 = 0x05,
C_MSP3430_SOURCE_I2S2 = 0x06
};
enum MSP3430_channel_matrix {
C_MSP3430_MATRIX_SOUND_A = 0x00,
C_MSP3430_MATRIX_SOUND_B = 0x10,
C_MSP3430_MATRIX_STEREO = 0x20,
C_MSP3430_MATRIX_MONO = 0x30
};
CMSP3430::CMSP3430(CI2CPort & port)
: fPort(port),
fAddress(0)
{
PRINT(("CMSP3430::CMSP3430()\n"));
if( fPort.InitCheck() == B_OK ) {
for (fAddress = 0x80; fAddress <= 0x80; fAddress += 0x02) {
if (fPort.Probe(fAddress)) {
PRINT(("CMSP3430::CMSP3430() - Sound Processor found at I2C port 0x%02x\n", fAddress));
break;
}
}
}
if( InitCheck() != B_OK )
PRINT(("CMSP3430::CMSP3430() - Sound processor not found!\n"));
}
CMSP3430::~CMSP3430()
{
PRINT(("CMSP3430::~CMSP3430()\n"));
}
status_t CMSP3430::InitCheck() const
{
status_t res;
res = fPort.InitCheck();
if( res != B_OK )
return res;
return (fAddress >= 0x80 && fAddress <= 0x80) ? B_OK : B_ERROR;
}
void CMSP3430::SetEnable(bool enable)
{
PRINT(("CMSP3430::SetEnable(%d)\n", enable));
SetControlRegister(MSP3430_CONTROL_RESET);
SetControlRegister(MSP3430_CONTROL_NORMAL);
if (enable) {
SetRegister(MSP3430_WR_DEM, MSP3430_DEM_MODUS, 0x2003);
SetRegister(MSP3430_WR_DEM, MSP3430_DEM_STANDARD_SEL, C_MSP3430_BTSC_STEREO);
SetRegister(MSP3430_WR_DSP, MSP3430_DSP_FM_PRESCALE, 0x2403);
SetRegister(MSP3430_WR_DSP, MSP3430_DSP_SRC_MAT_MAIN, 0x0320);
SetRegister(MSP3430_WR_DSP, MSP3430_DSP_VOL_MAIN, 0x7300);
SetRegister(MSP3430_WR_DSP, MSP3430_DSP_SRC_MAT_MAIN, 0x0320);
}
else {
SetRegister(MSP3430_WR_DSP, MSP3430_DSP_VOL_MAIN, 0x0000);
}
}
#if 0
#pragma mark -
void CMSP3430::SetI2S(bool fast)
{
SetRegister(MSP3430_WR_DEM, I2S_CONFIG, fast ? 0x0001 : 0x0000);
}
bool CMSP3430::IsSAP()
{
if ((Register(MSP3430_RD_DEM, STATUS) & 0x0100) != 0x0000)
return true;
return false;
}
bool CMSP3430::IsMonoNICAM()
{
if ((Register(MSP3430_RD_DEM, STATUS) & 0x0080) != 0x0000)
return true;
return false;
}
bool CMSP3430::IsStereo()
{
if ((Register(MSP3430_RD_DEM, STATUS) & 0x0040) != 0x0000)
return true;
return false;
}
bool CMSP3430::IsFM()
{
if ((Register(MSP3430_RD_DEM, STATUS) & 0x0120) == 0x0000)
return true;
return false;
}
bool CMSP3430::IsNICAM()
{
if ((Register(MSP3430_RD_DEM, STATUS) & 0x0100) == 0x0100)
return true;
return false;
}
bool CMSP3430::HasSecondaryCarrier()
{
if ((Register(MSP3430_RD_DEM, STATUS) & 0x0004) != 0x0000)
return true;
return false;
}
bool CMSP3430::HasPrimaryCarrier()
{
if ((Register(MSP3430_RD_DEM, STATUS) & 0x0002) != 0x0000)
return true;
return false;
}
void CMSP3430::SetStandard(MSP3430_standard standard)
{
fStandard = standard;
switch (standard) {
C_MSP3430_STANDARD_BG_FM:
C_MSP3430_STANDARD_DK_FM:
C_MSP3430_STANDARD_M_KOREA:
C_MSP3430_STANDARD_M_JAPAN:
C_MSP3430_STANDARD_BG_NICAM:
}
SetDemodulator();
}
void CMSP3430::SetFMPrescale(int gain, MSP3430_fm_matrix matrix, bool mute)
{
fFMPrescale = (mute ? 0x00 : Clamp(gain, 0x00, 0x7f)) << 8;
switch (matrix) {
case C_MSP3430_MATRIX_NONE:
fFMPrescale |= 0x0000;
break;
case C_MSP3430_MATRIX_GERMAN_STEREO_BG:
fFMPrescale |= 0x0001;
break;
case C_MSP3430_MATRIX_KOREAN_STEREO:
fFMPrescale |= 0x0002;
break;
case C_MSP3430_MATRIX_SOUND_A_MONO:
fFMPrescale |= 0x0003;
break;
case C_MSP3430_MATROX_SOUND_B_MONO:
fFMPrescale |= 0x0004;
break;
}
SetDemodulator();
}
void CMSP3430::SetNICAMPrescale(int gain, bool mute)
{
fNICAMPrescale = (mute ? 0x00 : Clamp(0x20 + (0x5f * gain) / 12, 0x20, 0x7f)) << 8;
SetDemodulator();
}
void CMSP3430::SetI2SPrescale(int gain, bool mute)
{
fI2SPrescale = (mute ? 0x00 : Clamp(0x10 + (0x7f * gain) / 18, 0x10, 0x7f) << 8;
SetSCARTInput();
}
void CMSP3430::SetSCARTPrescale(int gain, bool mute)
{
fSCARTPrescale = (mute ? 0x00 : Clamp(0x19 + (0x66 * gain) / 14, 0x19, 0x7f) << 8;
SetSCARTInput();
}
void CMSP3430::SetSource(MSP3430_source_channel speaker,
MSP3430_source_channel headphone,
MSP3430_source_channel scart1,
MSP3430_source_channel scart2,
MSP3430_source_channel i2s,
MSP3430_source_channel qpeak)
{
fSrcMain = loudspeaker;
fSrcAux = headphone;
fSrcSCART1 = scart1;
fSrcSCART2 = scart2;
fSrcI2S = i2s;
fSrcQPeak = qpeak;
SetOutputChannels();
}
void CMSP3430::SetVolume(int level, bool mute, MSP3430_clipping_mode mode,
MSP3430_automatic_volume automatic)
{
fVolume = (mute ? 0x00 : Clamp(level + 0x73, 0x01, 0x7f)) << 8;
switch (mode) {
case C_MSP3430_CLIP_REDUCE_VOLUME:
fVolume |= 0x00;
break;
case C_MSP3430_CLIP_REDUCE_TONE:
fVolume |= 0x01;
break;
case C_MSP3430_CLIP_COMPROMISE:
fVolume |= 0x02;
break;
case C_MSP3430_CLIP_DYNAMIC:
fVolume |= 0x03;
break;
}
switch (automatic) {
case C_MSP3430_AUTOMATIC_VOLUME_OFF:
fAVC = 0x0000;
break;
case C_MSP3430_AUTOMATIC_VOLUME_20_MS:
fAVC = 0x8100;
break;
case C_MSP3430_AUTOMATIC_VOLUME_2_SEC:
fAVC = 0x8200;
break;
case C_MSP3430_AUTOMATIC_VOLUME_4_SEC:
fAVC = 0x8400;
break;
case C_MSP3430_AUTOMATIC_VOLUME_8_SEC:
fAVC = 0x8800;
break;
}
SetOutputChannels();
}
void CMSP3430::SetBalance(int balance, MSP3430_balance_mode mode)
{
switch (mode) {
case C_MSP3430_BALANCE_LINEAR:
fBalance = (((0x7f * Clamp(balance, -100, 100)) / 100) << 8) + 0x0000;
break;
case C_MSP3430_BALANCE_LOGARITHMIC:
fBalance = (((0x7f * Clamp(balance, -128, 127)) / 127) << 8) + 0x0001;
break;
}
SetOutputChannels();
}
void CMSP3430::SetEqualizer(int bass, int treble)
{
if (bass <= 12)
fBass = Clamp(0x00 + 8 * bass, -0x60, 0x60) << 8;
else
fBass = Clamp(0x68 + 4 * (bass - 14), 0x68, 0x7f) << 8;
fTreble = Clamp(0x00 + 8 * treble, -0x60, 0x78) << 8;
fToneControl = 0x00;
fEqualizer[0] = fEqualizer[1] = fEqualizer[2] =
fEqualizer[3] = fEqualizer[4] = fEqualizer[5] = 0x00;
SetOutputChannels();
}
void CMSP3430::SetEqualizer(int gain[5])
{
for (int index = 0; index < 5; index++)
fEqualizer[index] = Clamp(0x00 + 8 * gain[index], -0x60, 0x60) << 8;
fToneControl = 0xff;
fBass = fTreble = 0x00;
SetOutputChannels();
}
void CMSP3430::SetLoudness(int loudness, MSP3430_loudness_mode mode)
{
fLoudness = Clamp(0x00 + 4 * loudness, 0x00, 0x44) << 8;
switch (mode) {
case C_MSP3430_LOUDNESS_NORMAL:
fLoudness |= 0x0000;
break;
case C_MSP3430_LOUDNESS_SUPER_BASS:
fLoudness |= 0x0004;
break;
}
SetOutputChannels();
}
void CMSP3430::SetSpatial(int strength, MSP3430_spatial_mode mode, MSP3430_spatial_highpass pass)
{
fSpatial = Clamp(0x00 + (0x7f * strength) / 100, -0x80, 0x7f) << 8;
switch (mode) {
case C_MSP3430_SPATIAL_MODE_A:
fSpatial |= 0x0000;
break;
case C_MSP3430_SPATIAL_MODE_B:
fSpatial |= 0x0020;
break;
}
switch (pass) {
case C_MSP3430_SPATIAL_MAX_HIGH_PASS:
fSpatial |= 0x0000;
break;
case C_MSP3430_SPATIAL_2_3_HIGH_PASS:
fSpatial |= 0x0002;
break;
case C_MSP3430_SPATIAL_1_3_HIGH_PASS:
fSpatial |= 0x0004;
break;
case C_MSP3430_SPATIAL_MIN_HIGH_PASS:
fSpatial |= 0x0006;
break;
case C_MSP3430_SPATIAL_AUTO_HIGH_PASS:
fSpatial |= 0x0008;
break;
}
SetOutputChannels();
}
void CMSP3430::SetSubwoofer(int level, int frequency, bool mute, MSP3430_subwoofer_mode mode)
{
fSubwooferLevel = (mute ? 0x80 : Clamp(0x00 + level, -128, 12)) << 8;
fSubwooferFrequency = Clamp(frequency / 10, 5, 40) << 8;
switch (mode) {
case C_MSP3430_SUBWOOFER_UNFILTERED:
fSubwooferFrequency |= 0x0000;
break;
case C_MSP3430_SUBWOOFER_HIGH_PASS:
fSubwooferFrequency |= 0x0001;
break;
case C_MSP3430_SUBWOOFER_MDB_MAIN:
fSubwooferFrequency |= 0x0002;
break;
}
fMDBStrength = 0x0000;
fMDBLimit = 0x0000;
fMDBHarmonic = 0x0000;
fMDBHighPass = 0x0a00;
fMDBLowPass = 0x0a00;
SetSubwooferAndMDBOutputChannels();
}
void CMSP3430::SetMDB(int strength, int limit, int harmonic,
int minfrequency, int maxfrequency, bool mute)
{
fMDBStrength = (mute ? 0x00 : Clamp(strength, 0x00, 0x7f)) << 7;
fMDBLimit = Clamp(limit, -32, 0) << 8;
fMDBHarmonic = Clamp((0x7f * harmonic) / 100, 0x00, 0x7f) << 8;
fMDBLowPass = Clamp(minFrequency / 10, 5, 30) << 8;
fMDBHighPass = Clamp(maxFrequency / 10, 2, 30) << 8;
fSubwooferLevel = 0x0000;
fSubwooferFrequency = 0x0002;
fVolume = (fVolume & ~0x000f) | 0x0003;
SetSubwooferAndMDBOutputChannels();
}
void CMSP3430::SetSCART(int level1, int level2, bool mute,
MSP3430_scart_input input,
MSP3430_scart_output output1,
MSP3430_scart_output output2)
{
fSCART1Volume = (mute ? 0x00 : Clamp(0x73 + (0x7f * level1) / 12, 0x00, 0x7f)) << 8;
fSCART2Volume = (mute ? 0x00 : Clamp(0x73 + (0x7f * level2) / 12, 0x00, 0x7f)) << 8;
fSCART1Volume |= 0x0001;
fSCART2Volume |= 0x0001;
fACB = 0x0000;
switch (input) {
case C_MSP3430_SCART_INPUT_SCART1:
fACB = 0x0000;
break;
case C_MSP3430_SCART_INPUT_MONO:
fACB = 0x0100;
break;
case C_MSP3430_SCART_INPUT_SCART2:
fACB = 0x0200;
break;
case C_MSP3430_SCART_INPUT_SCART3:
fACB = 0x0300;
break;
case C_MSP3430_SCART_INPUT_SCART4:
fACB = 0x0020;
break;
case C_MSP3430_SCART_INPUT_MUTE:
fACB = 0x0320;
break;
}
switch (output1) {
case C_MSP3430_SCART_OUTPUT_SCART3:
fACB |= 0x0000;
break;
case C_MSP3430_SCART_OUTPUT_SCART2:
fACB |= 0x0400;
break;
case C_MSP3430_SCART_OUTPUT_MONO:
fACB |= 0x0800;
break;
case C_MSP3430_SCART_OUTPUT_SCART1_DA:
fACB |= 0x0c00;
break;
case C_MSP3430_SCART_OUTPUT_SCART2_DA:
fACB |= 0x0080;
break;
case C_MSP3430_SCART_OUTPUT_SCART1_INPUT:
fACB |= 0x0480;
break;
case C_MSP3430_SCART_OUTPUT_SCART4_INPUT:
fACB |= 0x0880;
break;
case C_MSP3430_SCART_OUTPUT_MUTE:
fACB |= 0x0c80;
break;
}
switch (output2) {
case C_MSP3430_SCART_OUTPUT_SCART3:
fACB |= 0x0000;
break;
case C_MSP3430_SCART_OUTPUT_SCART2:
fACB |= 0x1000;
break;
case C_MSP3430_SCART_OUTPUT_MONO:
fACB |= 0x2000;
break;
case C_MSP3430_SCART_OUTPUT_SCART1_DA:
fACB |= 0x3000;
break;
case C_MSP3430_SCART_OUTPUT_SCART2_DA:
fACB |= 0x0200;
break;
case C_MSP3430_SCART_OUTPUT_SCART1_INPUT:
fACB |= 0x1200;
break;
case C_MSP3430_SCART_OUTPUT_SCART4_INPUT:
fACB |= 0x2200;
break;
case C_MSP3430_SCART_OUTPUT_MUTE:
fACB |= 0x3200;
break;
}
SetSCARTSignalPath();
SetOutputChannels();
}
void CMSP3430::SetBeeper(int volume, MSP3430_beeper_frequency frequency, bool mute)
{
int beeper = (mute ? 0x00 : Clamp(volume, 0x00, 0x7f)) << 8;
switch (frequency) {
case C_MSP3430_BEEPER_16_HZ:
beeper |= 0x0001;
break;
case C_MSP3430_BEEPER_1_KHZ:
beeper |= 0x0040;
break;
case C_MSP3430_BEEPER_4_KHZ:
beeper |= 0x00ff;
break;
}
SetRegister(MSP3430_WR_DSP, BEEPER, beeper);
}
void CMSP3430::SetQuasiPeak(int left, int right)
{
fQPeakLeft = left;
fQPeakRight = right;
SetOutputChannels();
}
void CMSP3430::GetVersion(char * version)
{
int revision = Register(MSP3430_RD_DSP, MSP_HARD_REVISION);
int product = Register(MSP3430_RD_DSP, MSP_PRODUCT_ROM);
sprintf(version, "MSP34%02d%c-%c%d",
((product & MSP_PRODUCT) >> 8),
((revision & MSP_REVISION) >> 0) + 0x40,
((revision & MSP_HARD) >> 8) + 0x40,
((product & MSP_ROM) >> 0));
}
#pragma mark -
void CMSP3430::Reset()
{
SetControlRegister(MSP3430_CONTROL_RESET);
SetControlRegister(MSP3430_CONTROL_NORMAL);
}
void CMSP3430::SetSCARTSignalPath()
{
SetRegister(MSP3430_WR_DSP, MSP3430_DSP_ACB_REG,fACB);
}
void CMSP3430::SetDemodulator()
{
SetRegister(MSP3430_WR_DEM, MODUS, 0x2003);
SetRegister(MSP3430_WR_DSP, PRE_FM, fFMPrescale);
SetRegister(MSP3430_WR_DSP, PRE_NICAM, fNICAMPrescale);
SetRegister(MSP3430_WR_DEM, MSP3430_DEM_STANDARD_SEL, 0x0001);
while ((fStandard = Register(MSP3430_RD_DEM, STANDARD_RES)) >= 0x0800)
snooze(100000);
}
void CMSP3430::SetSCARTInput()
{
SetRegister(MSP3430_WR_DSP, PRE_SCART, fSCARTPrescale);
SetRegister(MSP3430_WR_DSP, PRE_I2S1, fI2SPrescale);
SetRegister(MSP3430_WR_DSP, PRE_I2S2, fI2SPrescale);
}
void CMSP3430::SetOutputChannels()
{
SetRegister(MSP3430_WR_DSP, MSP3430_DSP_SRC_MAT_MAIN, fMainMatrix);
SetRegister(MSP3430_WR_DSP, MSP3430_DSP_SRC_MAT_AUX, fAuxMatrix);
SetRegister(MSP3430_WR_DSP, MSP3430_DSP_SRC_MAT_SCART1, fSCART1Matrix);
SetRegister(MSP3430_WR_DSP, MSP3430_DSP_SRC_MAT_SCART2, fSCART2Matrix);
SetRegister(MSP3430_WR_DSP, MSP3430_DSP_SRC_MAT_I2S, fI2SMatrix);
SetRegister(MSP3430_WR_DSP, MSP3430_DSP_SRC_MAT_QPEAK, fQPeakMatrix);
SetRegister(MSP3430_WR_DSP, MSP3430_DSP_TONE_MODE, fToneControl);
SetRegister(MSP3430_WR_DSP, MSP3430_DSP_BASS_MAIN, fBass);
SetRegister(MSP3430_WR_DSP, MSP3430_DSP_BASS_AUX, fBass);
SetRegister(MSP3430_WR_DSP, MSP3430_DSP_TREB_MAIN, fTreble);
SetRegister(MSP3430_WR_DSP, MSP3430_DSP_TREB_AUX, fTreble);
SetRegister(MSP3430_WR_DSP, MSP3430_DSP_EQUAL_BAND1, fEqualizer[0]);
SetRegister(MSP3430_WR_DSP, MSP3430_DSP_EQUAL_BAND2, fEqualizer[1]);
SetRegister(MSP3430_WR_DSP, MSP3430_DSP_EQUAL_BAND3, fEqualizer[2]);
SetRegister(MSP3430_WR_DSP, MSP3430_DSP_EQUAL_BAND4, fEqualizer[3]);
SetRegister(MSP3430_WR_DSP, MSP3430_DSP_EQUAL_BAND5, fEqualizer[4]);
SetRegister(MSP3430_WR_DSP, MSP3430_DSP_LOUD_MAIN, fLoudness);
SetRegister(MSP3430_WR_DSP, MSP3430_DSP_LOUD_AUX, fLoudness);
SetRegister(MSP3430_WR_DSP, MSP3430_DSP_SPAT_MAIN, fSpatial);
SetRegister(MSP3430_WR_DSP, MSP3430_DSP_VOL_MAIN, fVolume);
SetRegister(MSP3430_WR_DSP, MSP3430_DSP_VOL_AUX, fVolume);
SetRegister(MSP3430_WR_DSP, MSP3430_DSP_AVC, fAVC);
SetRegister(MSP3430_WR_DSP, MSP3430_DSP_BAL_MAIN, fBalance);
SetRegister(MSP3430_WR_DSP, MSP3430_DSP_BAL_AUX, fBalance);
SetRegister(MSP3430_WR_DSP, VOL_SCART1, fSCART1Volume);
SetRegister(MSP3430_WR_DSP, VOL_SCART2, fSCART2Volume);
SetRegister(MSP3430_WR_DSP, QPEAK_L, fQPeakLeft);
SetRegister(MSP3430_WR_DSP, QPEAK_R, fQPeakRight);
}
void CMSP3430::SetSubwooferAndMDBOutputChannels()
{
SetRegister(MSP3430_WR_DSP, SUBW_LEVEL, fSubwooferLevel);
SetRegister(MSP3430_WR_DSP, SUBW_FREQ, fSubwooferFrequency);
SetRegister(MSP3430_WR_DSP, MDB_STR, fMDBStrength);
SetRegister(MSP3430_WR_DSP, MDB_LIM, fMDBLimit);
SetRegister(MSP3430_WR_DSP, MDB_HMC, fMDBHarmonic);
SetRegister(MSP3430_WR_DSP, MDB_LP, fMDBLowPass);
SetRegister(MSP3430_WR_DSP, MDB_HP, fMDBHighPass);
}
#pragma mark -
#endif
int CMSP3430::ControlRegister()
{
char message[1], result[2];
message[0] = MSP3430_CONTROL;
if (fPort.Write(fAddress, message, sizeof(message), result, sizeof(result)))
return ((result[0] << 8) & 0xff00) + ((result[1] << 0) & 0x00ff);
return 0;
}
void CMSP3430::SetControlRegister(int value)
{
char message[3];
message[0] = MSP3430_CONTROL;
message[1] = value >> 8;
message[2] = value >> 0;
if (!fPort.Write(fAddress, message, sizeof(message)))
PRINT(("CMSP3430::SetControl() - error\n"));
}
int CMSP3430::Register(int address, int subaddress)
{
char message[3], response[2];
message[0] = address;
message[1] = subaddress >> 8;
message[2] = subaddress >> 0;
if (fPort.Write(fAddress, message, sizeof(message), response, sizeof(response)))
return ((response[0] << 8) & 0xff00) + ((response[1] << 0) & 0x00ff);
return 0;
}
void CMSP3430::SetRegister(int address, int subaddress, int value)
{
char message[5];
message[0] = address;
message[1] = subaddress >> 8;
message[2] = subaddress >> 0;
message[3] = value >> 8;
message[4] = value >> 0;
if (!fPort.Write(fAddress, message, sizeof(message)))
PRINT(("CMSP3430::SetRegister() - error\n"));
}