static int volToInt14(double vol) { double d=(DB2SLIDER(VAL2DB(vol))*16383.0/1000.0); if (d<0.0)d=0.0; else if (d>16383.0)d=16383.0; return (int)(d+0.5); }
static unsigned char volToChar(double vol) { double d=(DB2SLIDER(VAL2DB(vol))*127.0/1000.0); if (d<0.0)d=0.0; else if (d>127.0)d=127.0; return (unsigned char)(d+0.5); }
static BOOL WINAPI RemoteChannelItemProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { int m_userch=GetWindowLong(hwndDlg,GWL_USERDATA); // high 16 bits, user, low 16 bits, channel switch (uMsg) { case WM_INITDIALOG: SetWindowLong(hwndDlg,GWL_USERDATA,0x0fffffff); SendDlgItemMessage(hwndDlg,IDC_VU,PBM_SETRANGE,0,MAKELPARAM(0,100)); SendDlgItemMessage(hwndDlg,IDC_VOL,TBM_SETRANGE,FALSE,MAKELONG(0,100)); SendDlgItemMessage(hwndDlg,IDC_VOL,TBM_SETTIC,FALSE,63); SendDlgItemMessage(hwndDlg,IDC_PAN,TBM_SETRANGE,FALSE,MAKELONG(0,100)); SendDlgItemMessage(hwndDlg,IDC_PAN,TBM_SETTIC,FALSE,50); return 0; case WM_RCUSER_UPDATE: m_userch=((int)LOWORD(wParam) << 16) | LOWORD(lParam); SetWindowLong(hwndDlg,GWL_USERDATA,m_userch); break; } int user=m_userch>>16; int chan=m_userch&0xffff; switch (uMsg) { case WM_RCUSER_UPDATE: // update the items { g_client_mutex.Enter(); char *un=g_client->GetUserState(user,NULL,NULL,NULL); SetDlgItemText(hwndDlg,IDC_USERNAME,un?un:""); bool sub=0,m=0,s=0; float v=0,p=0; char *cn=g_client->GetUserChannelState(user,chan,&sub,&v,&p,&m,&s); g_client_mutex.Leave(); SetDlgItemText(hwndDlg,IDC_CHANNELNAME,cn?cn:""); CheckDlgButton(hwndDlg,IDC_RECV,sub?BST_CHECKED:0); CheckDlgButton(hwndDlg,IDC_MUTE,m?BST_CHECKED:0); CheckDlgButton(hwndDlg,IDC_SOLO,s?BST_CHECKED:0); SendDlgItemMessage(hwndDlg,IDC_VOL,TBM_SETPOS,TRUE,(LPARAM)DB2SLIDER(VAL2DB(v))); int t=(int)(p*50.0) + 50; if (t < 0) t=0; else if (t > 100)t=100; SendDlgItemMessage(hwndDlg,IDC_PAN,TBM_SETPOS,TRUE,t); { char tmp[512]; mkvolstr(tmp,v); SetDlgItemText(hwndDlg,IDC_VOLLBL,tmp); mkpanstr(tmp,p); SetDlgItemText(hwndDlg,IDC_PANLBL,tmp); } } break; case WM_LCUSER_VUUPDATE: { double val=VAL2DB(g_client->GetUserChannelPeak(user,chan)); int ival=(int)((val+100.0)); if (ival < 0) ival=0; else if (ival > 100) ival=100; SendDlgItemMessage(hwndDlg,IDC_VU,PBM_SETPOS,ival,0); char buf[128]; sprintf(buf,"%s%.2f dB",val>0.0?"+":"",val); SetDlgItemText(hwndDlg,IDC_VULBL,buf); } return 0; case WM_HSCROLL: { double pos=(double)SendMessage((HWND)lParam,TBM_GETPOS,0,0); g_client_mutex.Enter(); if ((HWND) lParam == GetDlgItem(hwndDlg,IDC_VOL)) { pos=SLIDER2DB(pos); if (fabs(pos- -6.0) < 0.5) pos=-6.0; else if (pos < -115.0) pos=-1000.0; pos=DB2VAL(pos); g_client->SetUserChannelState(user,chan,false,false,true,(float)pos,false,0.0,false,false,false,false); char tmp[512]; mkvolstr(tmp,pos); SetDlgItemText(hwndDlg,IDC_VOLLBL,tmp); } else if ((HWND) lParam == GetDlgItem(hwndDlg,IDC_PAN)) { pos=(pos-50.0)/50.0; if (fabs(pos) < 0.08) pos=0.0; g_client->SetUserChannelState(user,chan,false,false,false,0.0,true,(float)pos,false,false,false,false); char tmp[512]; mkpanstr(tmp,pos); SetDlgItemText(hwndDlg,IDC_PANLBL,tmp); } g_client_mutex.Leave(); } return 0; case WM_COMMAND: switch (LOWORD(wParam)) { case IDC_RECV: g_client_mutex.Enter(); g_client->SetUserChannelState(user,chan,true,!!IsDlgButtonChecked(hwndDlg,LOWORD(wParam)),false,0.0,false,0.0,false,false,false,false); g_client_mutex.Leave(); break; case IDC_SOLO: g_client_mutex.Enter(); g_client->SetUserChannelState(user,chan,false,false,false,0.0,false,0.0,false,false,true,!!IsDlgButtonChecked(hwndDlg,LOWORD(wParam))); g_client_mutex.Leave(); break; case IDC_MUTE: g_client_mutex.Enter(); g_client->SetUserChannelState(user,chan,false,false,false,0.0,false,0.0,true,!!IsDlgButtonChecked(hwndDlg,LOWORD(wParam)),false,false); g_client_mutex.Leave(); break; case IDC_VOLLBL: if (HIWORD(wParam) == STN_DBLCLK) { double vol = 1.0; g_client_mutex.Enter(); g_client->SetUserChannelState(user,chan,false,false,true,(float)vol,false,0.0,false,false,false,false); g_client_mutex.Leave(); SendDlgItemMessage(hwndDlg,IDC_VOL,TBM_SETPOS,TRUE,(LPARAM)DB2SLIDER(VAL2DB(vol))); char tmp[512]; mkvolstr(tmp,vol); SetDlgItemText(hwndDlg,IDC_VOLLBL,tmp); } break; case IDC_PANLBL: if (HIWORD(wParam) == STN_DBLCLK) { double pan = 0.0; int t=(int)(pan*50.0) + 50; if (t < 0) t=0; else if (t > 100)t=100; g_client_mutex.Enter(); g_client->SetUserChannelState(user,chan,false,false,false,0.0,true,(float)pan,false,false,false,false); g_client_mutex.Leave(); SendDlgItemMessage(hwndDlg,IDC_PAN,TBM_SETPOS,TRUE,t); char tmp[512]; mkpanstr(tmp,pan); SetDlgItemText(hwndDlg,IDC_PANLBL,tmp); } break; } return 0; } return 0; }