PPageAudioSwitcher.cpp

00001 /* 
00002  *      Copyright (C) 2003-2005 Gabest
00003  *      http://www.gabest.org
00004  *
00005  *  This Program is free software; you can redistribute it and/or modify
00006  *  it under the terms of the GNU General Public License as published by
00007  *  the Free Software Foundation; either version 2, or (at your option)
00008  *  any later version.
00009  *   
00010  *  This Program is distributed in the hope that it will be useful,
00011  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
00012  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
00013  *  GNU General Public License for more details.
00014  *   
00015  *  You should have received a copy of the GNU General Public License
00016  *  along with GNU Make; see the file COPYING.  If not, write to
00017  *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. 
00018  *  http://www.gnu.org/copyleft/gpl.html
00019  *
00020  */
00021 
00022 // PPageAudioSwitcher.cpp : implementation file
00023 //
00024 
00025 #include "stdafx.h"
00026 #include "mplayerc.h"
00027 #include "PPageAudioSwitcher.h"
00028 
00029 // CPPageAudioSwitcher dialog
00030 
00031 IMPLEMENT_DYNAMIC(CPPageAudioSwitcher, CPPageBase)
00032 CPPageAudioSwitcher::CPPageAudioSwitcher(IFilterGraph* pFG)
00033         : CPPageBase(CPPageAudioSwitcher::IDD, CPPageAudioSwitcher::IDD)
00034         , m_fDownSampleTo441(FALSE)
00035         , m_fCustomChannelMapping(FALSE)
00036         , m_nChannels(0)
00037         , m_fEnableAudioSwitcher(FALSE)
00038         , m_dwChannelMask(0)
00039         , m_tAudioTimeShift(0)
00040         , m_fAudioTimeShift(FALSE)
00041 {
00042         m_pAudioSwitcher = FindFilter(__uuidof(CAudioSwitcherFilter), pFG);
00043 }
00044 
00045 CPPageAudioSwitcher::~CPPageAudioSwitcher()
00046 {
00047 }
00048 
00049 void CPPageAudioSwitcher::DoDataExchange(CDataExchange* pDX)
00050 {
00051         __super::DoDataExchange(pDX);
00052         DDX_Check(pDX, IDC_CHECK3, m_fDownSampleTo441);
00053         DDX_Check(pDX, IDC_CHECK1, m_fCustomChannelMapping);
00054         DDX_Control(pDX, IDC_EDIT1, m_nChannelsCtrl);
00055         DDX_Text(pDX, IDC_EDIT1, m_nChannels);
00056         DDX_Control(pDX, IDC_SPIN1, m_nChannelsSpinCtrl);
00057         DDX_Control(pDX, IDC_LIST1, m_list);
00058         DDX_Check(pDX, IDC_CHECK2, m_fEnableAudioSwitcher);
00059         DDX_Control(pDX, IDC_CHECK3, m_fDownSampleTo441Ctrl);
00060         DDX_Control(pDX, IDC_CHECK1, m_fCustomChannelMappingCtrl);
00061         DDX_Control(pDX, IDC_EDIT2, m_tAudioTimeShiftCtrl);
00062         DDX_Control(pDX, IDC_SPIN2, m_tAudioTimeShiftSpin);
00063         DDX_Text(pDX, IDC_EDIT2, m_tAudioTimeShift);
00064         DDX_Check(pDX, IDC_CHECK4, m_fAudioTimeShift);
00065         DDX_Control(pDX, IDC_CHECK4, m_fAudioTimeShiftCtrl);
00066 }
00067 
00068 BEGIN_MESSAGE_MAP(CPPageAudioSwitcher, CPPageBase)
00069         ON_NOTIFY(NM_CLICK, IDC_LIST1, OnNMClickList1)
00070         ON_WM_DRAWITEM()
00071         ON_EN_CHANGE(IDC_EDIT1, OnEnChangeEdit1)
00072         ON_UPDATE_COMMAND_UI(IDC_CHECK3, OnUpdateAudioSwitcher)
00073         ON_UPDATE_COMMAND_UI(IDC_CHECK4, OnUpdateAudioSwitcher)
00074         ON_UPDATE_COMMAND_UI(IDC_EDIT2, OnUpdateAudioSwitcher)
00075         ON_UPDATE_COMMAND_UI(IDC_SPIN2, OnUpdateAudioSwitcher)
00076         ON_UPDATE_COMMAND_UI(IDC_CHECK1, OnUpdateAudioSwitcher)
00077         ON_UPDATE_COMMAND_UI(IDC_EDIT1, OnUpdateChannelMapping)
00078         ON_UPDATE_COMMAND_UI(IDC_SPIN1, OnUpdateChannelMapping)
00079         ON_UPDATE_COMMAND_UI(IDC_LIST1, OnUpdateChannelMapping)
00080         ON_UPDATE_COMMAND_UI(IDC_STATIC1, OnUpdateChannelMapping)
00081         ON_UPDATE_COMMAND_UI(IDC_STATIC2, OnUpdateChannelMapping)
00082         ON_UPDATE_COMMAND_UI(IDC_STATIC3, OnUpdateChannelMapping)
00083 END_MESSAGE_MAP()
00084 
00085 
00086 // CPPageAudioSwitcher message handlers
00087 
00088 BOOL CPPageAudioSwitcher::OnInitDialog()
00089 {
00090         __super::OnInitDialog();
00091 
00092         AppSettings& s = AfxGetAppSettings();
00093 
00094         m_fEnableAudioSwitcher = s.fEnableAudioSwitcher;
00095         m_fDownSampleTo441 = s.fDownSampleTo441;
00096         m_fAudioTimeShift = s.fAudioTimeShift;
00097         m_tAudioTimeShift = s.tAudioTimeShift;
00098         m_tAudioTimeShiftSpin.SetRange32(-1000*60*60*24, 1000*60*60*24);
00099         m_fCustomChannelMapping = s.fCustomChannelMapping;
00100         memcpy(m_pSpeakerToChannelMap, s.pSpeakerToChannelMap, sizeof(s.pSpeakerToChannelMap));
00101 
00102         if(m_pAudioSwitcher)
00103                 m_pAudioSwitcher->GetInputSpeakerConfig(&m_dwChannelMask);
00104 
00105         m_nChannels = 1;
00106         m_nChannelsSpinCtrl.SetRange(1, 18);
00107 
00108         if(m_pAudioSwitcher)
00109                 m_nChannels = m_pAudioSwitcher->GetNumberOfInputChannels();             
00110 
00111         m_list.InsertColumn(0, _T(""), LVCFMT_LEFT, 100);
00112         m_list.InsertItem(0, _T(""));
00113         m_list.InsertItem(1, _T("Front Left"));
00114         m_list.InsertItem(2, _T("Front Right"));
00115         m_list.InsertItem(3, _T("Front Center"));
00116         m_list.InsertItem(4, _T("Low Frequency"));
00117         m_list.InsertItem(5, _T("Back Left"));
00118         m_list.InsertItem(6, _T("Back Right"));
00119         m_list.InsertItem(7, _T("Front Left of Center"));
00120         m_list.InsertItem(8, _T("Front Right of Center"));
00121         m_list.InsertItem(9, _T("Back Center"));
00122         m_list.InsertItem(10, _T("Side Left"));
00123         m_list.InsertItem(11, _T("Side Right"));
00124         m_list.InsertItem(12, _T("Top Center"));
00125         m_list.InsertItem(13, _T("Top Front Left"));
00126         m_list.InsertItem(14, _T("Top Front Center"));
00127         m_list.InsertItem(15, _T("Top Front Right"));
00128         m_list.InsertItem(16, _T("Top Back Left"));
00129         m_list.InsertItem(17, _T("Top Back Center"));
00130         m_list.InsertItem(18, _T("Top Back Right"));
00131         m_list.SetColumnWidth(0, LVSCW_AUTOSIZE);
00132 
00133         for(int i = 1; i <= 18; i++)
00134         {
00135                 m_list.InsertColumn(i, _T(""), LVCFMT_CENTER, 16);
00136                 CString n;
00137                 n.Format(_T("%d"), i);
00138                 m_list.SetItemText(0, i, n);
00139 //              m_list.SetColumnWidth(i, LVSCW_AUTOSIZE);
00140 //              m_list.SetColumnWidth(i, m_list.GetColumnWidth(i)*8/10);
00141         }
00142 
00143         UpdateData(FALSE);
00144 
00145         return TRUE;  // return TRUE unless you set the focus to a control
00146         // EXCEPTION: OCX Property Pages should return FALSE
00147 }
00148 
00149 BOOL CPPageAudioSwitcher::OnApply()
00150 {
00151         UpdateData();
00152 
00153         AppSettings& s = AfxGetAppSettings();
00154 
00155         s.fEnableAudioSwitcher = !!m_fEnableAudioSwitcher;
00156         s.fDownSampleTo441 = !!m_fDownSampleTo441;
00157         s.fAudioTimeShift = !!m_fAudioTimeShift;
00158         s.tAudioTimeShift = m_tAudioTimeShift;
00159         s.fCustomChannelMapping = !!m_fCustomChannelMapping;
00160         memcpy(s.pSpeakerToChannelMap, m_pSpeakerToChannelMap, sizeof(m_pSpeakerToChannelMap));
00161 
00162         if(m_pAudioSwitcher)
00163         {
00164                 m_pAudioSwitcher->SetSpeakerConfig(s.fCustomChannelMapping, m_pSpeakerToChannelMap);
00165                 m_pAudioSwitcher->EnableDownSamplingTo441(s.fDownSampleTo441);
00166                 m_pAudioSwitcher->SetAudioTimeShift(m_fAudioTimeShift ? 10000i64*m_tAudioTimeShift : 0);
00167         }
00168 
00169         return __super::OnApply();
00170 }
00171 
00172 void CPPageAudioSwitcher::OnNMClickList1(NMHDR* pNMHDR, LRESULT* pResult)
00173 {
00174         LPNMLISTVIEW lpnmlv = (LPNMLISTVIEW)pNMHDR;
00175 
00176         if(lpnmlv->iItem > 0 && lpnmlv->iSubItem > 0 && lpnmlv->iSubItem <= m_nChannels)
00177         {
00178                 UpdateData();
00179                 m_pSpeakerToChannelMap[m_nChannels-1][lpnmlv->iItem-1] ^= 1<<(lpnmlv->iSubItem-1);
00180                 m_list.RedrawItems(lpnmlv->iItem, lpnmlv->iItem);
00181                 SetModified();
00182 
00183                 if(GetKeyState(VK_SHIFT) & 0x8000)
00184                 {
00185                         OnApply();
00186                 }
00187         }
00188 
00189         *pResult = 0;
00190 }
00191 
00192 void CPPageAudioSwitcher::OnEnChangeEdit1()
00193 {
00194         if(IsWindow(m_list.m_hWnd))
00195         {
00196                 UpdateData();
00197                 m_list.Invalidate();
00198         }
00199 }
00200 
00201 #include <math.h>
00202 
00203 void CPPageAudioSwitcher::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)
00204 {
00205         if(nIDCtl != IDC_LIST1) return;
00206 
00207 //      if(lpDrawItemStruct->itemID == 0)
00208 //              UpdateData();
00209 
00210         CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
00211 
00212         pDC->SetBkMode(TRANSPARENT);
00213 
00214         CPen p(PS_INSIDEFRAME, 1, 0xe0e0e0);
00215         CPen* old = pDC->SelectObject(&p);
00216 
00217         pDC->MoveTo(lpDrawItemStruct->rcItem.left, lpDrawItemStruct->rcItem.bottom-1);
00218         pDC->LineTo(lpDrawItemStruct->rcItem.right, lpDrawItemStruct->rcItem.bottom-1);
00219 
00220         CHeaderCtrl* pHeader = m_list.GetHeaderCtrl();
00221         int nColumnCount = pHeader->GetItemCount();
00222 
00223         for(int i = 0; i < nColumnCount; i++)
00224         {
00225                 CRect r, rb;
00226                 m_list.GetSubItemRect(lpDrawItemStruct->itemID, i, LVIR_BOUNDS, rb);
00227                 m_list.GetSubItemRect(lpDrawItemStruct->itemID, i, LVIR_LABEL, r);
00228 
00229                 pDC->MoveTo(r.right-1, r.top);
00230                 pDC->LineTo(r.right-1, r.bottom-1);
00231 
00232                 CSize s = pDC->GetTextExtent(m_list.GetItemText(lpDrawItemStruct->itemID, i));
00233 
00234                 if(i == 0)
00235                 {
00236                         r.left = rb.left;
00237 
00238                         if(lpDrawItemStruct->itemID == 0)
00239                         {
00240                                 pDC->MoveTo(0, 0);
00241                                 pDC->LineTo(r.right, r.bottom-1);
00242                         }
00243                         else
00244                         {
00245                                 pDC->SetTextColor(m_list.IsWindowEnabled() ? 0 : 0xb0b0b0);
00246                                 pDC->TextOut(r.left+1, (r.top+r.bottom-s.cy)/2, m_list.GetItemText(lpDrawItemStruct->itemID, i));
00247                         }
00248                 }
00249                 else
00250                 {
00251                         pDC->SetTextColor(i > m_nChannels ? 0xe0e0e0 : (!m_list.IsWindowEnabled() ? 0xb0b0b0 : 0));
00252 
00253                         if(lpDrawItemStruct->itemID == 0)
00254                         {
00255                                 pDC->TextOut((r.left+r.right-s.cx)/2, (r.top+r.bottom-s.cy)/2, m_list.GetItemText(lpDrawItemStruct->itemID, i));
00256                         }
00257                         else
00258                         {
00259                                 if(m_dwChannelMask & (1<<(lpDrawItemStruct->itemID-1)))
00260                                 {
00261                                         int nBitsSet = 0;
00262 
00263                                         for(int j = 1; j <= (1<<(lpDrawItemStruct->itemID-1)); j <<= 1)
00264                                         {
00265                                                 if(m_dwChannelMask & j)
00266                                                         nBitsSet++;
00267                                         }
00268 
00269                                         if(nBitsSet == i)
00270                                         {
00271                                                 COLORREF tmp = pDC->GetTextColor();
00272 
00273                                                 pDC->SetTextColor(0xe0e0e0);
00274                                                 CFont f;
00275                                                 f.CreatePointFont(MulDiv(100, 96, pDC->GetDeviceCaps(LOGPIXELSX)), _T("Marlett"));
00276                                                 CFont* old = pDC->SelectObject(&f);
00277                                                 s = pDC->GetTextExtent(_T("g"));
00278                                                 pDC->TextOut((r.left+r.right-s.cx)/2, (r.top+r.bottom-s.cy)/2, _T("g"));
00279 
00280                                                 pDC->SetTextColor(tmp);
00281                                         }
00282                                 }
00283 
00284                                 if(m_pSpeakerToChannelMap[m_nChannels-1][lpDrawItemStruct->itemID-1] & (1<<(i-1)))
00285                                 {
00286                                         CFont f;
00287                                         f.CreatePointFont(MulDiv(100, 96, pDC->GetDeviceCaps(LOGPIXELSX)), _T("Marlett"));
00288                                         CFont* old = pDC->SelectObject(&f);
00289                                         s = pDC->GetTextExtent(_T("a"));
00290                                         pDC->TextOut((r.left+r.right-s.cx)/2, (r.top+r.bottom-s.cy)/2, _T("a"));
00291                                         pDC->SelectObject(old);
00292                                 }
00293                         }
00294                 }
00295         }
00296 
00297         pDC->SelectObject(old);
00298 }
00299 
00300 void CPPageAudioSwitcher::OnUpdateAudioSwitcher(CCmdUI* pCmdUI)
00301 {
00302 //      UpdateData();
00303         pCmdUI->Enable(IsDlgButtonChecked(IDC_CHECK2)/*m_fEnableAudioSwitcher*/);
00304 }
00305 
00306 void CPPageAudioSwitcher::OnUpdateChannelMapping(CCmdUI* pCmdUI)
00307 {
00308 //      UpdateData();
00309         pCmdUI->Enable(IsDlgButtonChecked(IDC_CHECK2)/*m_fEnableAudioSwitcher*/ 
00310                 && IsDlgButtonChecked(IDC_CHECK1)/*m_fCustomChannelMapping*/);
00311 }

Generated on Tue Dec 13 14:47:00 2005 for guliverkli by  doxygen 1.4.5