📄 yss903.c
字号:
/***************************************************************/
extern tmLibdevErr_t yss903Read(UInt8 addr, UInt8 *data)
{
int i, counter;
if (addr == 0x10)
{ /* hardware is readable */
for (counter = 0; counter < 10; counter++)
{
if (((ReadKaraCtrlReg() & 0x01)) == 0)
break;
microsleep (100);
}
if (counter >= 10)
return ERR_YSS903_YSS_READ_FAILED;
DP(("yss903Read from %x (%d)\n",addr, counter));
WriteKaraAddrReg(0x10); /* Perhaps can only read register 0x10 */
WriteKaraCtrlReg(0x01);
for (counter = 0; counter < 10; counter++)
{
if (((ReadKaraCtrlReg() & 0x01)) == 0)
break;
microsleep (100);
}
if (counter >= 10)
return ERR_YSS903_YSS_READ_FAILED;
*data = ReadKaraDataReg();
return TMLIBDEV_OK;
}
/* take it from shadow register */
if (InKaraokeMode)
{
for (i=0; i< sizeof(yssKaraokeModeShadow); i+=2)
{
if (addr == yssKaraokeModeShadow[i])
{
*data = yssKaraokeModeShadow[i+1];
return TMLIBDEV_OK;
}
}
}
else
{
for (i=0; i< sizeof(yssMovieModeShadow); i+=2)
{
if (addr == yssMovieModeShadow[i])
{
*data = yssMovieModeShadow[i+1];
return TMLIBDEV_OK;
}
}
}
return ERR_YSS903_YSS_READ_FAILED;
}
/******************************************************/
static tmLibdevErr_t yss903WriteRegisters(UInt8 *data, Int size)
{
int i;
tmLibdevErr_t err;
for(i=0; i<size; i+=2)
{
DP(("%d: ", i));
if (err = yss903Write(data[i], data[i+1]))
return err;
}
return TMLIBDEV_OK;
}
/********************************************************************/
extern Bool yss903Init( Address dataReg, Address ctrlReg, Address addrReg)
{
int i;
DP_L2(("yss903Init()\n"));
tmAssert(sizeof(yssMovieModeInit) == sizeof(yssMovieModeShadow), ERR_YSS903_YSS_STRUCTURE_SIZE_ERROR );
tmAssert(sizeof(yssKaraokeModeInit) == sizeof(yssKaraokeModeShadow), ERR_YSS903_YSS_STRUCTURE_SIZE_ERROR );
/* fill in static register addresses before they are used */
YssData = dataReg;
YssCtrl = ctrlReg;
YssAddr = addrReg;
for (i=0; i< sizeof(yssMovieModeInit); i++)
yssMovieModeShadow[i] = yssMovieModeInit[i];
for (i=0; i< sizeof(yssKaraokeModeInit); i++)
yssKaraokeModeShadow[i] = yssKaraokeModeInit[i];
return yss903SelectMovieMode();
}
/* choose operational mode (karaoke or Movie) */
extern Bool yss903SelectMovieMode(void)
{
DP_L2(("yss903SelectMovieMode()\n"));
InKaraokeMode = False;
if(yss903WriteRegisters(yssMovieModeShadow, sizeof(yssMovieModeShadow)) )
return False;
return True;
}
extern Bool yss903SelectKaraokeMode(void)
{
DP_L2(("yss903SelectKaraokeMode()\n"));
InKaraokeMode = True;
if(yss903WriteRegisters(yssKaraokeModeShadow, sizeof(yssKaraokeModeShadow)))
return False;
return True;
}
/* set the volume of line input. value in dB. */
extern Bool yss903SetLineInputVolume(float leftVol, float rightVol)
{
float value;
Int ival;
DP_L2(("yss903SetLineInputVolume()\n"));
value = pow(10.0, leftVol*0.05);
value *= 127.0;
ival = (Int)value;
if (yss903Write(0x3E, ival))
return False;
if (InKaraokeMode) /* shadow both modes */
{
int i;
for (i=0; i< sizeof(yssMovieModeShadow); i+=2) {
if (yssMovieModeShadow[i] == 0x3e)
yssMovieModeShadow[i+1] = ival;
}
} else {
int i;
for (i=0; i< sizeof(yssKaraokeModeShadow); i+=2) {
if (yssKaraokeModeShadow[i] == 0x3e)
yssKaraokeModeShadow[i+1] = ival;
}
}
value = pow(10.0, rightVol*0.05);
value *= 127.0;
ival = (Int)value;
if (yss903Write(0x3F, ival))
return False;
if (InKaraokeMode) /* shadow both modes */
{
int i;
for (i=0; i< sizeof(yssMovieModeShadow); i+=2) {
if (yssMovieModeShadow[i] == 0x3f)
yssMovieModeShadow[i+1] = ival;
}
} else {
int i;
for (i=0; i< sizeof(yssKaraokeModeShadow); i+=2) {
if (yssKaraokeModeShadow[i] == 0x3f)
yssKaraokeModeShadow[i+1] = ival;
}
}
return True;
}
/* set the volume of mic input. value in dB. */
extern Bool yss903SetMicInputVolume (float level)
{
Int ival;
if (level > 0.0) ival = 0;
else if (level < -45.0) ival = 0x1F;
else ival = (Int)(level / -1.5);
if (yss903Write(0x35, ival))
return False;
if (InKaraokeMode) /* shadow both modes */
{
int i;
for (i=0; i< sizeof(yssMovieModeShadow); i+=2) {
if (yssMovieModeShadow[i] == 0x35)
yssMovieModeShadow[i+1] = ival;
}
} else {
int i;
for (i=0; i< sizeof(yssKaraokeModeShadow); i+=2) {
if (yssKaraokeModeShadow[i] == 0x35)
yssKaraokeModeShadow[i+1] = ival;
}
}
return True;
}
/***************************************************************/
/* set the tone controls of line input. Values in dB, -10 to +10 in 2dB steps */
extern Bool yss903SetLineInputTreble(float level)
{
UInt8 ival;
DP_L2(("yss903SetLineInputTreble()\n"));
if(level > 10.0) ival = 5;
else if(level >= 0) ival = ((Int) level)/2;
else if(level >= -10.0) ival = 16 + ((Int) level)/2;
else ival = 0x0b;
DP_L2(("treble ival is %x\n", ival));
if (yss903WriteBits(0x05, ival<<4, 0xF0))
return False;
if (InKaraokeMode) /* shadow both modes */
{
int i;
for (i=0; i< sizeof(yssMovieModeShadow); i+=2) {
if (yssMovieModeShadow[i] == 0x05)
yssMovieModeShadow[i+1] = (yssMovieModeShadow[i+1] & 0x0F) | (ival<<4);
}
} else {
int i;
for (i=0; i< sizeof(yssKaraokeModeShadow); i+=2) {
if (yssKaraokeModeShadow[i] == 0x05)
yssKaraokeModeShadow[i+1] = (yssKaraokeModeShadow[i+1] & 0x0F) | (ival<<4);
}
}
return True;
}
/***************************************************************/
extern Bool yss903SetLineInputMidrange(float level)
{
UInt8 ival;
DP_L2(("yss903SetLineInputMidrange()\n"));
if(level > 10.0) ival = 5;
else if(level >= 0) ival = ((Int) level)/2;
else if(level >= -10.0) ival = 16 + ((Int) level)/2;
else ival = 0x0b;
if (yss903WriteBits(0x06, ival, 0x0F))
return False;
if (InKaraokeMode) /* shadow both modes */
{
int i;
for (i=0; i< sizeof(yssMovieModeShadow); i+=2) {
if (yssMovieModeShadow[i] == 0x06)
yssMovieModeShadow[i+1] = (yssMovieModeShadow[i+1] & 0xF0) | ival;
}
} else {
int i;
for (i=0; i< sizeof(yssKaraokeModeShadow); i+=2) {
if (yssKaraokeModeShadow[i] == 0x06)
yssKaraokeModeShadow[i+1] = (yssKaraokeModeShadow[i+1] & 0xF0) | ival;
}
}
return True;
}
/***************************************************************/
extern Bool yss903SetLineInputBass(float level)
{
UInt8 ival;
DP_L2(("yss903SetLineInputBass()\n"));
if(level > 10.0) ival = 5;
else if(level >= 0) ival = ((Int) level)/2;
else if(level >= -10.0) ival = 16 + ((Int) level)/2;
else ival = 0x0b;
if (yss903WriteBits(0x05, ival, 0x0F))
return False;
if (InKaraokeMode) /* shadow both modes */
{
int i;
for (i=0; i< sizeof(yssMovieModeShadow); i+=2) {
if (yssMovieModeShadow[i] == 0x05)
yssMovieModeShadow[i+1] = (yssMovieModeShadow[i+1] & 0xF0) | ival;
}
} else {
int i;
for (i=0; i< sizeof(yssKaraokeModeShadow); i+=2) {
if (yssKaraokeModeShadow[i] == 0x05)
yssKaraokeModeShadow[i+1] = (yssKaraokeModeShadow[i+1] & 0xF0) | ival;
}
}
return True;
}
/***************************************************************/
extern Bool yss903SetSurroundMode(yss903SurroundMode_t mode)
{
UInt8 surround_on_para_kara[]=
{ 0x21, 0x60,
0x24, 0x60 };
UInt8 surround_on_para_movie[]=
{ 0x30, 0x30, /* feed from before tone */
0x31, 0x30,
0x32, 0,
0x33, 0,
0x38, 0x30, /* feed some of direct reflections into output */
0x39, 0x30,
0x3c, 0x0, /* feed mix of direct and reflected (not reflected only) to Ymersion */
0x3d, 0x0,
0x3a, 0x30, /* feed mix of direct and reflected to Ymersion */
0x3b, 0x30,
0x21, 0x30, /* mix back in */
0x24, 0x30 };
UInt8 surround_off_para_kara[]=
{ 0x21, 0x00,
0x24, 0x00 };
UInt8 surround_off_para_movie[]=
{ 0x30, 0x0, /* feed from before tone */
0x31, 0x0,
0x32, 0,
0x33, 0,
0x38, 0x0, /* feed some of direct reflections into output */
0x39, 0x0,
0x3c, 0x0, /* feed mix of direct and reflected (not reflected only) to Ymersion */
0x3d, 0x0,
0x3a, 0x0, /* feed mix of direct and reflected to Ymersion */
0x3b, 0x0,
0x21, 0x0, /* mix back in */
0x24, 0x0 };
DP_L2(("yss903SetSurroundMode()\n"));
switch (mode)
{
case yss903SurroundOff:
if (InKaraokeMode)
yss903WriteRegisters(surround_off_para_kara, sizeof(surround_off_para_kara));
else
yss903WriteRegisters(surround_off_para_movie, sizeof(surround_off_para_movie));
break;
case yss903SurroundPseudoStereo:
if (!InKaraokeMode)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -