1159b3361Sopenharmony_ci/*
2159b3361Sopenharmony_ci *  LAME MP3 encoder for DirectShow
3159b3361Sopenharmony_ci *  Basic property page
4159b3361Sopenharmony_ci *
5159b3361Sopenharmony_ci *  Copyright (c) 2000-2005 Marie Orlova, Peter Gubanov, Vitaly Ivanov, Elecard Ltd.
6159b3361Sopenharmony_ci *
7159b3361Sopenharmony_ci * This library is free software; you can redistribute it and/or
8159b3361Sopenharmony_ci * modify it under the terms of the GNU Library General Public
9159b3361Sopenharmony_ci * License as published by the Free Software Foundation; either
10159b3361Sopenharmony_ci * version 2 of the License, or (at your option) any later version.
11159b3361Sopenharmony_ci *
12159b3361Sopenharmony_ci * This library is distributed in the hope that it will be useful,
13159b3361Sopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of
14159b3361Sopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15159b3361Sopenharmony_ci * Library General Public License for more details.
16159b3361Sopenharmony_ci *
17159b3361Sopenharmony_ci * You should have received a copy of the GNU Library General Public
18159b3361Sopenharmony_ci * License along with this library; if not, write to the
19159b3361Sopenharmony_ci * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
20159b3361Sopenharmony_ci * Boston, MA 02111-1307, USA.
21159b3361Sopenharmony_ci */
22159b3361Sopenharmony_ci
23159b3361Sopenharmony_ci#include <streams.h>
24159b3361Sopenharmony_ci#include <olectl.h>
25159b3361Sopenharmony_ci#include <commctrl.h>
26159b3361Sopenharmony_ci#include "iaudioprops.h"
27159b3361Sopenharmony_ci#include "mpegac.h"
28159b3361Sopenharmony_ci#include "resource.h"
29159b3361Sopenharmony_ci#include "PropPage.h"
30159b3361Sopenharmony_ci#include "Reg.h"
31159b3361Sopenharmony_ci
32159b3361Sopenharmony_ci// strings to appear in comboboxes
33159b3361Sopenharmony_ciconst char * szBitRateString[2][14] = {
34159b3361Sopenharmony_ci    {
35159b3361Sopenharmony_ci        "32 kbps","40 kbps","48 kbps","56 kbps",
36159b3361Sopenharmony_ci        "64 kbps","80 kbps","96 kbps","112 kbps",
37159b3361Sopenharmony_ci        "128 kbps","160 kbps","192 kbps","224 kbps",
38159b3361Sopenharmony_ci        "256 kbps","320 kbps"
39159b3361Sopenharmony_ci    },
40159b3361Sopenharmony_ci    {
41159b3361Sopenharmony_ci        "8 kbps","16 kbps","24 kbps","32 kbps",
42159b3361Sopenharmony_ci        "40 kbps","48 kbps","56 kbps","64 kbps",
43159b3361Sopenharmony_ci        "80 kbps","96 kbps","112 kbps","128 kbps",
44159b3361Sopenharmony_ci        "144 kbps","160 kbps"
45159b3361Sopenharmony_ci    }
46159b3361Sopenharmony_ci};
47159b3361Sopenharmony_ci
48159b3361Sopenharmony_ciLPCSTR szQualityDesc[10] = {
49159b3361Sopenharmony_ci    "High", "High", "High", "High", "High",
50159b3361Sopenharmony_ci    "Medium", "Medium",
51159b3361Sopenharmony_ci    "Low", "Low",
52159b3361Sopenharmony_ci    "Fast mode"
53159b3361Sopenharmony_ci};
54159b3361Sopenharmony_ci
55159b3361Sopenharmony_ciLPCSTR szVBRqDesc[10] = {
56159b3361Sopenharmony_ci    "0 - ~1:4",
57159b3361Sopenharmony_ci    "1 - ~1:5",
58159b3361Sopenharmony_ci    "2 - ~1:6",
59159b3361Sopenharmony_ci    "3 - ~1:7",
60159b3361Sopenharmony_ci    "4 - ~1:9",
61159b3361Sopenharmony_ci    "5 - ~1:9",
62159b3361Sopenharmony_ci    "6 - ~1:10",
63159b3361Sopenharmony_ci    "7 - ~1:11",
64159b3361Sopenharmony_ci    "8 - ~1:12",
65159b3361Sopenharmony_ci    "9 - ~1:14"
66159b3361Sopenharmony_ci};
67159b3361Sopenharmony_ci
68159b3361Sopenharmony_cistruct SSampleRate {
69159b3361Sopenharmony_ci    DWORD dwSampleRate;
70159b3361Sopenharmony_ci    LPCSTR lpSampleRate;
71159b3361Sopenharmony_ci};
72159b3361Sopenharmony_ci
73159b3361Sopenharmony_ciSSampleRate srRates[9] = {
74159b3361Sopenharmony_ci    // MPEG-1
75159b3361Sopenharmony_ci    {48000, "48 kHz"},
76159b3361Sopenharmony_ci    {44100, "44.1 kHz"},
77159b3361Sopenharmony_ci    {32000, "32 kHz"},
78159b3361Sopenharmony_ci
79159b3361Sopenharmony_ci    // MPEG-2
80159b3361Sopenharmony_ci    {24000, "24 kHz"},
81159b3361Sopenharmony_ci    {22050, "22.05 kHz"},
82159b3361Sopenharmony_ci    {16000, "16 kHz"},
83159b3361Sopenharmony_ci
84159b3361Sopenharmony_ci    // MPEG-2.5
85159b3361Sopenharmony_ci    {12000, "12 kHz"},
86159b3361Sopenharmony_ci    {11025, "11.025 kHz"},
87159b3361Sopenharmony_ci    { 8000, "8 kHz"}
88159b3361Sopenharmony_ci};
89159b3361Sopenharmony_ci
90159b3361Sopenharmony_ci////////////////////////////////////////////////////////////////
91159b3361Sopenharmony_ci// CreateInstance
92159b3361Sopenharmony_ci////////////////////////////////////////////////////////////////
93159b3361Sopenharmony_ciCUnknown *CMpegAudEncPropertyPage::CreateInstance( LPUNKNOWN punk, HRESULT *phr )
94159b3361Sopenharmony_ci{
95159b3361Sopenharmony_ci    CMpegAudEncPropertyPage *pNewObject
96159b3361Sopenharmony_ci        = new CMpegAudEncPropertyPage( punk, phr );
97159b3361Sopenharmony_ci
98159b3361Sopenharmony_ci    if( pNewObject == NULL )
99159b3361Sopenharmony_ci        *phr = E_OUTOFMEMORY;
100159b3361Sopenharmony_ci
101159b3361Sopenharmony_ci    return pNewObject;
102159b3361Sopenharmony_ci}
103159b3361Sopenharmony_ci
104159b3361Sopenharmony_ci////////////////////////////////////////////////////////////////
105159b3361Sopenharmony_ci// Constructor
106159b3361Sopenharmony_ci////////////////////////////////////////////////////////////////
107159b3361Sopenharmony_ciCMpegAudEncPropertyPage::CMpegAudEncPropertyPage(LPUNKNOWN punk, HRESULT *phr)
108159b3361Sopenharmony_ci : CBasePropertyPage(NAME("Encoder Property Page"),
109159b3361Sopenharmony_ci                      punk, IDD_AUDIOENCPROPS, IDS_AUDIO_PROPS_TITLE)
110159b3361Sopenharmony_ci    , m_pAEProps(NULL)
111159b3361Sopenharmony_ci{
112159b3361Sopenharmony_ci    ASSERT(phr);
113159b3361Sopenharmony_ci
114159b3361Sopenharmony_ci    m_srIdx = 0;
115159b3361Sopenharmony_ci
116159b3361Sopenharmony_ci    InitCommonControls();
117159b3361Sopenharmony_ci}
118159b3361Sopenharmony_ci
119159b3361Sopenharmony_ci//
120159b3361Sopenharmony_ci// OnConnect
121159b3361Sopenharmony_ci//
122159b3361Sopenharmony_ci// Give us the filter to communicate with
123159b3361Sopenharmony_ciHRESULT CMpegAudEncPropertyPage::OnConnect(IUnknown *pUnknown)
124159b3361Sopenharmony_ci{
125159b3361Sopenharmony_ci    ASSERT(m_pAEProps == NULL);
126159b3361Sopenharmony_ci
127159b3361Sopenharmony_ci    // Ask the filter for it's control interface
128159b3361Sopenharmony_ci
129159b3361Sopenharmony_ci    HRESULT hr = pUnknown->QueryInterface(IID_IAudioEncoderProperties,(void **)&m_pAEProps);
130159b3361Sopenharmony_ci    if (FAILED(hr))
131159b3361Sopenharmony_ci        return E_NOINTERFACE;
132159b3361Sopenharmony_ci
133159b3361Sopenharmony_ci    ASSERT(m_pAEProps);
134159b3361Sopenharmony_ci
135159b3361Sopenharmony_ci    // Get current filter state
136159b3361Sopenharmony_ci    m_pAEProps->get_Bitrate(&m_dwBitrate);
137159b3361Sopenharmony_ci    m_pAEProps->get_Variable(&m_dwVariable);
138159b3361Sopenharmony_ci    m_pAEProps->get_VariableMin(&m_dwMin);
139159b3361Sopenharmony_ci    m_pAEProps->get_VariableMax(&m_dwMax);
140159b3361Sopenharmony_ci    m_pAEProps->get_Quality(&m_dwQuality);
141159b3361Sopenharmony_ci    m_pAEProps->get_VariableQ(&m_dwVBRq);
142159b3361Sopenharmony_ci    m_pAEProps->get_SampleRate(&m_dwSampleRate);
143159b3361Sopenharmony_ci    m_pAEProps->get_CRCFlag(&m_dwCRC);
144159b3361Sopenharmony_ci    m_pAEProps->get_ForceMono(&m_dwForceMono);
145159b3361Sopenharmony_ci    m_pAEProps->get_CopyrightFlag(&m_dwCopyright);
146159b3361Sopenharmony_ci    m_pAEProps->get_OriginalFlag(&m_dwOriginal);
147159b3361Sopenharmony_ci
148159b3361Sopenharmony_ci    return NOERROR;
149159b3361Sopenharmony_ci}
150159b3361Sopenharmony_ci
151159b3361Sopenharmony_ci//
152159b3361Sopenharmony_ci// OnDisconnect
153159b3361Sopenharmony_ci//
154159b3361Sopenharmony_ci// Release the interface
155159b3361Sopenharmony_ci
156159b3361Sopenharmony_ciHRESULT CMpegAudEncPropertyPage::OnDisconnect()
157159b3361Sopenharmony_ci{
158159b3361Sopenharmony_ci    // Release the interface
159159b3361Sopenharmony_ci    if (m_pAEProps == NULL)
160159b3361Sopenharmony_ci        return E_UNEXPECTED;
161159b3361Sopenharmony_ci
162159b3361Sopenharmony_ci    m_pAEProps->set_Bitrate(m_dwBitrate);
163159b3361Sopenharmony_ci    m_pAEProps->set_Variable(m_dwVariable);
164159b3361Sopenharmony_ci    m_pAEProps->set_VariableMin(m_dwMin);
165159b3361Sopenharmony_ci    m_pAEProps->set_VariableMax(m_dwMax);
166159b3361Sopenharmony_ci    m_pAEProps->set_Quality(m_dwQuality);
167159b3361Sopenharmony_ci    m_pAEProps->set_VariableQ(m_dwVBRq);
168159b3361Sopenharmony_ci    m_pAEProps->set_SampleRate(m_dwSampleRate);
169159b3361Sopenharmony_ci    m_pAEProps->set_CRCFlag(m_dwCRC);
170159b3361Sopenharmony_ci    m_pAEProps->set_ForceMono(m_dwForceMono);
171159b3361Sopenharmony_ci    m_pAEProps->set_CopyrightFlag(m_dwCopyright);
172159b3361Sopenharmony_ci    m_pAEProps->set_OriginalFlag(m_dwOriginal);
173159b3361Sopenharmony_ci    m_pAEProps->SaveAudioEncoderPropertiesToRegistry();
174159b3361Sopenharmony_ci
175159b3361Sopenharmony_ci    m_pAEProps->Release();
176159b3361Sopenharmony_ci    m_pAEProps = NULL;
177159b3361Sopenharmony_ci
178159b3361Sopenharmony_ci    return NOERROR;
179159b3361Sopenharmony_ci}
180159b3361Sopenharmony_ci
181159b3361Sopenharmony_ci//
182159b3361Sopenharmony_ci// OnActivate
183159b3361Sopenharmony_ci//
184159b3361Sopenharmony_ci// Called on dialog creation
185159b3361Sopenharmony_ci
186159b3361Sopenharmony_ciHRESULT CMpegAudEncPropertyPage::OnActivate(void)
187159b3361Sopenharmony_ci{
188159b3361Sopenharmony_ci    InitPropertiesDialog(m_hwnd);
189159b3361Sopenharmony_ci
190159b3361Sopenharmony_ci    return NOERROR;
191159b3361Sopenharmony_ci}
192159b3361Sopenharmony_ci
193159b3361Sopenharmony_ci//
194159b3361Sopenharmony_ci// OnDeactivate
195159b3361Sopenharmony_ci//
196159b3361Sopenharmony_ci// Called on dialog destruction
197159b3361Sopenharmony_ci
198159b3361Sopenharmony_ciHRESULT CMpegAudEncPropertyPage::OnDeactivate(void)
199159b3361Sopenharmony_ci{
200159b3361Sopenharmony_ci    return NOERROR;
201159b3361Sopenharmony_ci}
202159b3361Sopenharmony_ci
203159b3361Sopenharmony_ci////////////////////////////////////////////////////////////////
204159b3361Sopenharmony_ci// OnReceiveMessage - message handler function
205159b3361Sopenharmony_ci////////////////////////////////////////////////////////////////
206159b3361Sopenharmony_ciBOOL CMpegAudEncPropertyPage::OnReceiveMessage(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
207159b3361Sopenharmony_ci{
208159b3361Sopenharmony_ci    switch (uMsg)
209159b3361Sopenharmony_ci    {
210159b3361Sopenharmony_ci    case WM_HSCROLL:
211159b3361Sopenharmony_ci        if ((HWND)lParam == m_hwndQuality)
212159b3361Sopenharmony_ci        {
213159b3361Sopenharmony_ci            int pos = SendMessage(m_hwndQuality, TBM_GETPOS, 0, 0);
214159b3361Sopenharmony_ci            if (pos >= 0 && pos < 10)
215159b3361Sopenharmony_ci            {
216159b3361Sopenharmony_ci                SetDlgItemText(hwnd,IDC_TEXT_QUALITY,szQualityDesc[pos]);
217159b3361Sopenharmony_ci                m_pAEProps->set_Quality(pos);
218159b3361Sopenharmony_ci                SetDirty();
219159b3361Sopenharmony_ci            }
220159b3361Sopenharmony_ci        }
221159b3361Sopenharmony_ci        break;
222159b3361Sopenharmony_ci
223159b3361Sopenharmony_ci    case WM_COMMAND:
224159b3361Sopenharmony_ci        switch (LOWORD(wParam))
225159b3361Sopenharmony_ci        {
226159b3361Sopenharmony_ci        case IDC_COMBO_CBR:
227159b3361Sopenharmony_ci            if (HIWORD(wParam) == CBN_SELCHANGE)
228159b3361Sopenharmony_ci            {
229159b3361Sopenharmony_ci                int nBitrate = SendDlgItemMessage(hwnd, IDC_COMBO_CBR, CB_GETCURSEL, 0, 0L);
230159b3361Sopenharmony_ci                DWORD dwSampleRate;
231159b3361Sopenharmony_ci                m_pAEProps->get_SampleRate(&dwSampleRate);
232159b3361Sopenharmony_ci                DWORD dwBitrate;
233159b3361Sopenharmony_ci
234159b3361Sopenharmony_ci                if (dwSampleRate >= 32000)
235159b3361Sopenharmony_ci                {
236159b3361Sopenharmony_ci                    // Consider MPEG-1
237159b3361Sopenharmony_ci                    dwBitrate = dwBitRateValue[0][nBitrate];
238159b3361Sopenharmony_ci                }
239159b3361Sopenharmony_ci                else
240159b3361Sopenharmony_ci                {
241159b3361Sopenharmony_ci                    // Consider MPEG-2/2.5
242159b3361Sopenharmony_ci                    dwBitrate = dwBitRateValue[1][nBitrate];
243159b3361Sopenharmony_ci                }
244159b3361Sopenharmony_ci
245159b3361Sopenharmony_ci                m_pAEProps->set_Bitrate(dwBitrate);
246159b3361Sopenharmony_ci
247159b3361Sopenharmony_ci                SetDirty();
248159b3361Sopenharmony_ci            }
249159b3361Sopenharmony_ci            break;
250159b3361Sopenharmony_ci
251159b3361Sopenharmony_ci        case IDC_COMBO_VBRMIN:
252159b3361Sopenharmony_ci            if (HIWORD(wParam) == CBN_SELCHANGE)
253159b3361Sopenharmony_ci            {
254159b3361Sopenharmony_ci                int nVariableMin = SendDlgItemMessage(hwnd, IDC_COMBO_VBRMIN, CB_GETCURSEL, 0, 0L);
255159b3361Sopenharmony_ci                DWORD dwSampleRate;
256159b3361Sopenharmony_ci                m_pAEProps->get_SampleRate(&dwSampleRate);
257159b3361Sopenharmony_ci                DWORD dwMin;
258159b3361Sopenharmony_ci
259159b3361Sopenharmony_ci                if (dwSampleRate >= 32000)
260159b3361Sopenharmony_ci                {
261159b3361Sopenharmony_ci                    // Consider MPEG-1
262159b3361Sopenharmony_ci                    dwMin = dwBitRateValue[0][nVariableMin];
263159b3361Sopenharmony_ci                }
264159b3361Sopenharmony_ci                else
265159b3361Sopenharmony_ci                {
266159b3361Sopenharmony_ci                    // Consider MPEG-2/2.5
267159b3361Sopenharmony_ci                    dwMin = dwBitRateValue[1][nVariableMin];
268159b3361Sopenharmony_ci                }
269159b3361Sopenharmony_ci
270159b3361Sopenharmony_ci                m_pAEProps->set_VariableMin(dwMin);
271159b3361Sopenharmony_ci
272159b3361Sopenharmony_ci                SetDirty();
273159b3361Sopenharmony_ci            }
274159b3361Sopenharmony_ci            break;
275159b3361Sopenharmony_ci
276159b3361Sopenharmony_ci        case IDC_COMBO_VBRMAX:
277159b3361Sopenharmony_ci            if (HIWORD(wParam) == CBN_SELCHANGE)
278159b3361Sopenharmony_ci            {
279159b3361Sopenharmony_ci                int nVariableMax = SendDlgItemMessage(hwnd, IDC_COMBO_VBRMAX, CB_GETCURSEL, 0, 0L);
280159b3361Sopenharmony_ci                DWORD dwSampleRate;
281159b3361Sopenharmony_ci                m_pAEProps->get_SampleRate(&dwSampleRate);
282159b3361Sopenharmony_ci                DWORD dwMax;
283159b3361Sopenharmony_ci
284159b3361Sopenharmony_ci                if (dwSampleRate >= 32000)
285159b3361Sopenharmony_ci                {
286159b3361Sopenharmony_ci                    // Consider MPEG-1
287159b3361Sopenharmony_ci                    dwMax = dwBitRateValue[0][nVariableMax];
288159b3361Sopenharmony_ci                }
289159b3361Sopenharmony_ci                else
290159b3361Sopenharmony_ci                {
291159b3361Sopenharmony_ci                    // Consider MPEG-2/2.5
292159b3361Sopenharmony_ci                    dwMax = dwBitRateValue[1][nVariableMax];
293159b3361Sopenharmony_ci                }
294159b3361Sopenharmony_ci
295159b3361Sopenharmony_ci                m_pAEProps->set_VariableMax(dwMax);
296159b3361Sopenharmony_ci
297159b3361Sopenharmony_ci                SetDirty();
298159b3361Sopenharmony_ci            }
299159b3361Sopenharmony_ci            break;
300159b3361Sopenharmony_ci
301159b3361Sopenharmony_ci        case IDC_COMBO_SAMPLE_RATE:
302159b3361Sopenharmony_ci            if (HIWORD(wParam) == CBN_SELCHANGE)
303159b3361Sopenharmony_ci            {
304159b3361Sopenharmony_ci                int nSampleRate = SendDlgItemMessage(hwnd, IDC_COMBO_SAMPLE_RATE, CB_GETCURSEL, 0, 0L);
305159b3361Sopenharmony_ci
306159b3361Sopenharmony_ci                if (nSampleRate < 0)
307159b3361Sopenharmony_ci                    nSampleRate = 0;
308159b3361Sopenharmony_ci                else if (nSampleRate > 2)
309159b3361Sopenharmony_ci                    nSampleRate = 2;
310159b3361Sopenharmony_ci
311159b3361Sopenharmony_ci                DWORD dwSampleRate = srRates[nSampleRate * 3 + m_srIdx].dwSampleRate;
312159b3361Sopenharmony_ci
313159b3361Sopenharmony_ci                m_pAEProps->set_SampleRate(dwSampleRate);
314159b3361Sopenharmony_ci                InitPropertiesDialog(hwnd);
315159b3361Sopenharmony_ci                SetDirty();
316159b3361Sopenharmony_ci            }
317159b3361Sopenharmony_ci            break;
318159b3361Sopenharmony_ci
319159b3361Sopenharmony_ci        case IDC_COMBO_VBRq:
320159b3361Sopenharmony_ci            if (HIWORD(wParam) == CBN_SELCHANGE)
321159b3361Sopenharmony_ci            {
322159b3361Sopenharmony_ci                int nVBRq = SendDlgItemMessage(hwnd, IDC_COMBO_VBRq, CB_GETCURSEL, 0, 0L);
323159b3361Sopenharmony_ci                if (nVBRq >=0 && nVBRq <=9)
324159b3361Sopenharmony_ci                    m_pAEProps->set_VariableQ(nVBRq);
325159b3361Sopenharmony_ci                SetDirty();
326159b3361Sopenharmony_ci            }
327159b3361Sopenharmony_ci            break;
328159b3361Sopenharmony_ci
329159b3361Sopenharmony_ci        case IDC_RADIO_CBR:
330159b3361Sopenharmony_ci        case IDC_RADIO_VBR:
331159b3361Sopenharmony_ci            m_pAEProps->set_Variable(LOWORD(wParam)-IDC_RADIO_CBR);
332159b3361Sopenharmony_ci            SetDirty();
333159b3361Sopenharmony_ci            break;
334159b3361Sopenharmony_ci
335159b3361Sopenharmony_ci        case IDC_CHECK_PES:
336159b3361Sopenharmony_ci            m_pAEProps->set_PESOutputEnabled(IsDlgButtonChecked(hwnd, IDC_CHECK_PES));
337159b3361Sopenharmony_ci            SetDirty();
338159b3361Sopenharmony_ci            break;
339159b3361Sopenharmony_ci
340159b3361Sopenharmony_ci        case IDC_CHECK_COPYRIGHT:
341159b3361Sopenharmony_ci            m_pAEProps->set_CopyrightFlag(IsDlgButtonChecked(hwnd, IDC_CHECK_COPYRIGHT));
342159b3361Sopenharmony_ci            SetDirty();
343159b3361Sopenharmony_ci            break;
344159b3361Sopenharmony_ci
345159b3361Sopenharmony_ci        case IDC_CHECK_ORIGINAL:
346159b3361Sopenharmony_ci            m_pAEProps->set_OriginalFlag(IsDlgButtonChecked(hwnd, IDC_CHECK_ORIGINAL));
347159b3361Sopenharmony_ci            SetDirty();
348159b3361Sopenharmony_ci            break;
349159b3361Sopenharmony_ci
350159b3361Sopenharmony_ci        case IDC_CHECK_CRC:
351159b3361Sopenharmony_ci            m_pAEProps->set_CRCFlag(IsDlgButtonChecked(hwnd, IDC_CHECK_CRC));
352159b3361Sopenharmony_ci            SetDirty();
353159b3361Sopenharmony_ci            break;
354159b3361Sopenharmony_ci
355159b3361Sopenharmony_ci        case IDC_FORCE_MONO:
356159b3361Sopenharmony_ci            m_pAEProps->set_ForceMono(IsDlgButtonChecked(hwnd, IDC_FORCE_MONO));
357159b3361Sopenharmony_ci            SetDirty();
358159b3361Sopenharmony_ci            break;
359159b3361Sopenharmony_ci        }
360159b3361Sopenharmony_ci        return TRUE;
361159b3361Sopenharmony_ci
362159b3361Sopenharmony_ci    case WM_DESTROY:
363159b3361Sopenharmony_ci        return TRUE;
364159b3361Sopenharmony_ci
365159b3361Sopenharmony_ci    default:
366159b3361Sopenharmony_ci        return FALSE;
367159b3361Sopenharmony_ci    }
368159b3361Sopenharmony_ci
369159b3361Sopenharmony_ci    return TRUE;
370159b3361Sopenharmony_ci}
371159b3361Sopenharmony_ci
372159b3361Sopenharmony_ci//
373159b3361Sopenharmony_ci// OnApplyChanges
374159b3361Sopenharmony_ci//
375159b3361Sopenharmony_ciHRESULT CMpegAudEncPropertyPage::OnApplyChanges()
376159b3361Sopenharmony_ci{
377159b3361Sopenharmony_ci    m_pAEProps->get_Bitrate(&m_dwBitrate);
378159b3361Sopenharmony_ci    m_pAEProps->get_Variable(&m_dwVariable);
379159b3361Sopenharmony_ci    m_pAEProps->get_VariableMin(&m_dwMin);
380159b3361Sopenharmony_ci    m_pAEProps->get_VariableMax(&m_dwMax);
381159b3361Sopenharmony_ci    m_pAEProps->get_Quality(&m_dwQuality);
382159b3361Sopenharmony_ci    m_pAEProps->get_VariableQ(&m_dwVBRq);
383159b3361Sopenharmony_ci    m_pAEProps->get_SampleRate(&m_dwSampleRate);
384159b3361Sopenharmony_ci    m_pAEProps->get_CRCFlag(&m_dwCRC);
385159b3361Sopenharmony_ci    m_pAEProps->get_ForceMono(&m_dwForceMono);
386159b3361Sopenharmony_ci    m_pAEProps->get_CopyrightFlag(&m_dwCopyright);
387159b3361Sopenharmony_ci    m_pAEProps->get_OriginalFlag(&m_dwOriginal);
388159b3361Sopenharmony_ci    m_pAEProps->SaveAudioEncoderPropertiesToRegistry();
389159b3361Sopenharmony_ci
390159b3361Sopenharmony_ci    m_pAEProps->ApplyChanges();
391159b3361Sopenharmony_ci
392159b3361Sopenharmony_ci    return S_OK;
393159b3361Sopenharmony_ci}
394159b3361Sopenharmony_ci
395159b3361Sopenharmony_ci//
396159b3361Sopenharmony_ci// Initialize dialogbox controls with proper values
397159b3361Sopenharmony_ci//
398159b3361Sopenharmony_civoid CMpegAudEncPropertyPage::InitPropertiesDialog(HWND hwndParent)
399159b3361Sopenharmony_ci{
400159b3361Sopenharmony_ci    EnableControls(hwndParent, TRUE);
401159b3361Sopenharmony_ci
402159b3361Sopenharmony_ci    m_hwndQuality = GetDlgItem(hwndParent,IDC_SLIDER_QUALITY);
403159b3361Sopenharmony_ci    DWORD dwQuality;
404159b3361Sopenharmony_ci    m_pAEProps->get_Quality(&dwQuality);
405159b3361Sopenharmony_ci    SendDlgItemMessage(hwndParent, IDC_SLIDER_QUALITY, TBM_SETRANGE, 1, MAKELONG (2,9));
406159b3361Sopenharmony_ci    SendDlgItemMessage(hwndParent, IDC_SLIDER_QUALITY, TBM_SETPOS, 1, dwQuality);
407159b3361Sopenharmony_ci    if (dwQuality>=0 && dwQuality<10)
408159b3361Sopenharmony_ci        SetDlgItemText(hwndParent,IDC_TEXT_QUALITY,szQualityDesc[dwQuality]);
409159b3361Sopenharmony_ci
410159b3361Sopenharmony_ci    //
411159b3361Sopenharmony_ci    // initialize sample rate selection
412159b3361Sopenharmony_ci    //
413159b3361Sopenharmony_ci    DWORD dwSourceSampleRate;
414159b3361Sopenharmony_ci    m_pAEProps->get_SourceSampleRate(&dwSourceSampleRate);
415159b3361Sopenharmony_ci
416159b3361Sopenharmony_ci    SendDlgItemMessage(hwndParent, IDC_COMBO_SAMPLE_RATE, CB_RESETCONTENT, 0, 0L);
417159b3361Sopenharmony_ci
418159b3361Sopenharmony_ci    switch (dwSourceSampleRate)
419159b3361Sopenharmony_ci    {
420159b3361Sopenharmony_ci    case 48000:
421159b3361Sopenharmony_ci    case 24000:
422159b3361Sopenharmony_ci    case 12000:
423159b3361Sopenharmony_ci        m_srIdx = 0;
424159b3361Sopenharmony_ci        break;
425159b3361Sopenharmony_ci
426159b3361Sopenharmony_ci    case 32000:
427159b3361Sopenharmony_ci    case 16000:
428159b3361Sopenharmony_ci    case  8000:
429159b3361Sopenharmony_ci        m_srIdx = 2;
430159b3361Sopenharmony_ci        break;
431159b3361Sopenharmony_ci
432159b3361Sopenharmony_ci    case 44100:
433159b3361Sopenharmony_ci    case 22050:
434159b3361Sopenharmony_ci    case 11025:
435159b3361Sopenharmony_ci    default:
436159b3361Sopenharmony_ci        m_srIdx = 1;
437159b3361Sopenharmony_ci    }
438159b3361Sopenharmony_ci
439159b3361Sopenharmony_ci    for (int i = 0; i < 3; i++)
440159b3361Sopenharmony_ci        SendDlgItemMessage(hwndParent, IDC_COMBO_SAMPLE_RATE, CB_ADDSTRING, 0, (LPARAM)(LPCTSTR)srRates[i * 3 + m_srIdx].lpSampleRate);
441159b3361Sopenharmony_ci
442159b3361Sopenharmony_ci    DWORD dwSampleRate;
443159b3361Sopenharmony_ci    m_pAEProps->get_SampleRate(&dwSampleRate);
444159b3361Sopenharmony_ci    m_pAEProps->set_SampleRate(dwSampleRate);
445159b3361Sopenharmony_ci
446159b3361Sopenharmony_ci    int nSR = 0;
447159b3361Sopenharmony_ci    while (dwSampleRate != srRates[nSR * 3 + m_srIdx].dwSampleRate && nSR < 3)
448159b3361Sopenharmony_ci    {
449159b3361Sopenharmony_ci        nSR++;
450159b3361Sopenharmony_ci    }
451159b3361Sopenharmony_ci
452159b3361Sopenharmony_ci    if (nSR >= 3)
453159b3361Sopenharmony_ci        nSR = 0;
454159b3361Sopenharmony_ci
455159b3361Sopenharmony_ci    SendDlgItemMessage(hwndParent, IDC_COMBO_SAMPLE_RATE, CB_SETCURSEL, nSR, 0);
456159b3361Sopenharmony_ci
457159b3361Sopenharmony_ci    DWORD dwChannels;
458159b3361Sopenharmony_ci    m_pAEProps->get_SourceChannels(&dwChannels);
459159b3361Sopenharmony_ci
460159b3361Sopenharmony_ci    //
461159b3361Sopenharmony_ci    //initialize VBRq combo box
462159b3361Sopenharmony_ci    //
463159b3361Sopenharmony_ci    int k;
464159b3361Sopenharmony_ci    SendDlgItemMessage(hwndParent, IDC_COMBO_VBRq, CB_RESETCONTENT, 0, 0);
465159b3361Sopenharmony_ci    for (k = 0; k < 10; k++)
466159b3361Sopenharmony_ci        SendDlgItemMessage(hwndParent, IDC_COMBO_VBRq, CB_ADDSTRING, 0, (LPARAM)(LPCTSTR)szVBRqDesc[k]);
467159b3361Sopenharmony_ci    DWORD dwVBRq;
468159b3361Sopenharmony_ci    m_pAEProps->get_VariableQ(&dwVBRq);
469159b3361Sopenharmony_ci    if (dwVBRq<0)
470159b3361Sopenharmony_ci        dwVBRq = 0;
471159b3361Sopenharmony_ci    if (dwVBRq>9)
472159b3361Sopenharmony_ci        dwVBRq = 9;
473159b3361Sopenharmony_ci    m_pAEProps->set_VariableQ(dwVBRq);
474159b3361Sopenharmony_ci    SendDlgItemMessage(hwndParent, IDC_COMBO_VBRq, CB_SETCURSEL, dwVBRq, 0);
475159b3361Sopenharmony_ci
476159b3361Sopenharmony_ci//////////////////////////////////////
477159b3361Sopenharmony_ci// initialize CBR selection
478159b3361Sopenharmony_ci//////////////////////////////////////
479159b3361Sopenharmony_ci    int nSt;
480159b3361Sopenharmony_ci
481159b3361Sopenharmony_ci    SendDlgItemMessage(hwndParent, IDC_COMBO_CBR, CB_RESETCONTENT, 0, 0);
482159b3361Sopenharmony_ci    if (dwSampleRate >= 32000)
483159b3361Sopenharmony_ci    {
484159b3361Sopenharmony_ci        // If target sampling rate is less than 32000, consider
485159b3361Sopenharmony_ci        // MPEG 1 audio
486159b3361Sopenharmony_ci        nSt = 0;
487159b3361Sopenharmony_ci        for (int i = 0; i < 14; i++)
488159b3361Sopenharmony_ci            SendDlgItemMessage(hwndParent, IDC_COMBO_CBR, CB_ADDSTRING, 0, (LPARAM)(LPCTSTR)szBitRateString[0][i]);
489159b3361Sopenharmony_ci    }
490159b3361Sopenharmony_ci    else
491159b3361Sopenharmony_ci    {
492159b3361Sopenharmony_ci        // Consider MPEG 2 / 2.5 audio
493159b3361Sopenharmony_ci        nSt = 1;
494159b3361Sopenharmony_ci        for (int i = 0; i < 14 ; i++)
495159b3361Sopenharmony_ci            SendDlgItemMessage(hwndParent, IDC_COMBO_CBR, CB_ADDSTRING, 0, (LPARAM)(LPCTSTR)szBitRateString[1][i]);
496159b3361Sopenharmony_ci    }
497159b3361Sopenharmony_ci
498159b3361Sopenharmony_ci    DWORD dwBitrate;
499159b3361Sopenharmony_ci    m_pAEProps->get_Bitrate(&dwBitrate);
500159b3361Sopenharmony_ci
501159b3361Sopenharmony_ci    int nBitrateSel = 0;
502159b3361Sopenharmony_ci    // BitRateValue[][i] is in ascending order
503159b3361Sopenharmony_ci    // We use this fact. We also know there are 14 bitrate values available.
504159b3361Sopenharmony_ci    // We are going to use the closest possible, so we can limit loop with 13
505159b3361Sopenharmony_ci    while (nBitrateSel < 13 && dwBitRateValue[nSt][nBitrateSel] < dwBitrate)
506159b3361Sopenharmony_ci        nBitrateSel++;
507159b3361Sopenharmony_ci    SendDlgItemMessage(hwndParent, IDC_COMBO_CBR, CB_SETCURSEL, nBitrateSel, 0);
508159b3361Sopenharmony_ci
509159b3361Sopenharmony_ci    // check if the specified bitrate is found exactly and correct if not
510159b3361Sopenharmony_ci    if (dwBitRateValue[nSt][nBitrateSel] != dwBitrate)
511159b3361Sopenharmony_ci    {
512159b3361Sopenharmony_ci        dwBitrate = dwBitRateValue[nSt][nBitrateSel];
513159b3361Sopenharmony_ci        // we can change it, because it is independent of any other parameters
514159b3361Sopenharmony_ci        // (but depends on some of them!)
515159b3361Sopenharmony_ci        m_pAEProps->set_Bitrate(dwBitrate);
516159b3361Sopenharmony_ci    }
517159b3361Sopenharmony_ci
518159b3361Sopenharmony_ci    //
519159b3361Sopenharmony_ci    // Check VBR/CBR radio button
520159b3361Sopenharmony_ci    //
521159b3361Sopenharmony_ci    DWORD dwVariable;
522159b3361Sopenharmony_ci    m_pAEProps->get_Variable(&dwVariable);
523159b3361Sopenharmony_ci    CheckRadioButton(hwndParent, IDC_RADIO_CBR, IDC_RADIO_VBR, IDC_RADIO_CBR + dwVariable);
524159b3361Sopenharmony_ci
525159b3361Sopenharmony_ci//////////////////////////////////////////////////
526159b3361Sopenharmony_ci// initialize VBR selection
527159b3361Sopenharmony_ci//////////////////////////////////////////////////
528159b3361Sopenharmony_ci    //VBRMIN, VBRMAX
529159b3361Sopenharmony_ci    int j, nST;
530159b3361Sopenharmony_ci
531159b3361Sopenharmony_ci    SendDlgItemMessage(hwndParent, IDC_COMBO_VBRMIN, CB_RESETCONTENT, 0, 0);
532159b3361Sopenharmony_ci    SendDlgItemMessage(hwndParent, IDC_COMBO_VBRMAX, CB_RESETCONTENT, 0, 0);
533159b3361Sopenharmony_ci
534159b3361Sopenharmony_ci    if (dwSampleRate >= 32000)
535159b3361Sopenharmony_ci    {
536159b3361Sopenharmony_ci            nST = 0;
537159b3361Sopenharmony_ci            for (j=0; j<14 ;j++) {
538159b3361Sopenharmony_ci                SendDlgItemMessage(hwndParent, IDC_COMBO_VBRMIN, CB_ADDSTRING, 0, (LPARAM)(LPCTSTR)szBitRateString[0][j]);
539159b3361Sopenharmony_ci                SendDlgItemMessage(hwndParent, IDC_COMBO_VBRMAX, CB_ADDSTRING, 0, (LPARAM)(LPCTSTR)szBitRateString[0][j]);
540159b3361Sopenharmony_ci            }
541159b3361Sopenharmony_ci    }
542159b3361Sopenharmony_ci    else
543159b3361Sopenharmony_ci    {
544159b3361Sopenharmony_ci            nST = 1;
545159b3361Sopenharmony_ci            for (j = 0; j < 14; j++)
546159b3361Sopenharmony_ci            {
547159b3361Sopenharmony_ci                SendDlgItemMessage(hwndParent, IDC_COMBO_VBRMIN, CB_ADDSTRING, 0, (LPARAM)(LPCTSTR)szBitRateString[1][j]);
548159b3361Sopenharmony_ci                SendDlgItemMessage(hwndParent, IDC_COMBO_VBRMAX, CB_ADDSTRING, 0, (LPARAM)(LPCTSTR)szBitRateString[1][j]);
549159b3361Sopenharmony_ci            }
550159b3361Sopenharmony_ci    }
551159b3361Sopenharmony_ci
552159b3361Sopenharmony_ci    DWORD dwMin,dwMax;
553159b3361Sopenharmony_ci    m_pAEProps->get_VariableMin(&dwMin);
554159b3361Sopenharmony_ci    m_pAEProps->get_VariableMax(&dwMax);
555159b3361Sopenharmony_ci
556159b3361Sopenharmony_ci    int nVariableMinSel = 0;
557159b3361Sopenharmony_ci    int nVariableMaxSel = 0;
558159b3361Sopenharmony_ci
559159b3361Sopenharmony_ci    // BitRateValue[][i] is in ascending order
560159b3361Sopenharmony_ci    // We use this fact. We also know there are 14 bitrate values available.
561159b3361Sopenharmony_ci    // We are going to use the closest possible, so we can limit loop with 13
562159b3361Sopenharmony_ci    while (nVariableMinSel<13 && dwBitRateValue[nST][nVariableMinSel] < dwMin)
563159b3361Sopenharmony_ci        nVariableMinSel++;
564159b3361Sopenharmony_ci    SendDlgItemMessage(hwndParent, IDC_COMBO_VBRMIN, CB_SETCURSEL, nVariableMinSel, 0);
565159b3361Sopenharmony_ci
566159b3361Sopenharmony_ci    while (nVariableMaxSel<13 && dwBitRateValue[nST][nVariableMaxSel] < dwMax)
567159b3361Sopenharmony_ci        nVariableMaxSel++;
568159b3361Sopenharmony_ci    SendDlgItemMessage(hwndParent, IDC_COMBO_VBRMAX, CB_SETCURSEL, nVariableMaxSel, 0);
569159b3361Sopenharmony_ci
570159b3361Sopenharmony_ci
571159b3361Sopenharmony_ci    // check if the specified bitrate is found exactly and correct if not
572159b3361Sopenharmony_ci    if (dwBitRateValue[nST][nVariableMinSel] != dwMin)
573159b3361Sopenharmony_ci    {
574159b3361Sopenharmony_ci        dwMin = dwBitRateValue[nST][nVariableMinSel];
575159b3361Sopenharmony_ci        // we can change it, because it is independent of any other parameters
576159b3361Sopenharmony_ci        // (but depends on some of them!)
577159b3361Sopenharmony_ci        m_pAEProps->set_VariableMin(dwMin);
578159b3361Sopenharmony_ci    }
579159b3361Sopenharmony_ci
580159b3361Sopenharmony_ci    // check if the specified bitrate is found exactly and correct if not
581159b3361Sopenharmony_ci    if (dwBitRateValue[nST][nVariableMaxSel] != dwMax)
582159b3361Sopenharmony_ci    {
583159b3361Sopenharmony_ci        dwMax = dwBitRateValue[nST][nVariableMaxSel];
584159b3361Sopenharmony_ci        // we can change it, because it is independent of any other parameters
585159b3361Sopenharmony_ci        // (but depends on some of them!)
586159b3361Sopenharmony_ci        m_pAEProps->set_VariableMax(dwMax);
587159b3361Sopenharmony_ci    }
588159b3361Sopenharmony_ci
589159b3361Sopenharmony_ci    //
590159b3361Sopenharmony_ci    // initialize checkboxes
591159b3361Sopenharmony_ci    //
592159b3361Sopenharmony_ci    DWORD dwPES;
593159b3361Sopenharmony_ci    m_pAEProps->get_PESOutputEnabled(&dwPES);
594159b3361Sopenharmony_ci
595159b3361Sopenharmony_ci    dwPES = 0;
596159b3361Sopenharmony_ci    CheckDlgButton(hwndParent, IDC_CHECK_PES, dwPES ? BST_CHECKED : BST_UNCHECKED);
597159b3361Sopenharmony_ci
598159b3361Sopenharmony_ci    DWORD dwCRC;
599159b3361Sopenharmony_ci    m_pAEProps->get_CRCFlag(&dwCRC);
600159b3361Sopenharmony_ci    CheckDlgButton(hwndParent, IDC_CHECK_CRC, dwCRC ? BST_CHECKED : BST_UNCHECKED);
601159b3361Sopenharmony_ci
602159b3361Sopenharmony_ci    DWORD dwForceMono;
603159b3361Sopenharmony_ci    m_pAEProps->get_ForceMono(&dwForceMono);
604159b3361Sopenharmony_ci    CheckDlgButton(hwndParent, IDC_FORCE_MONO, dwForceMono ? BST_CHECKED : BST_UNCHECKED);
605159b3361Sopenharmony_ci
606159b3361Sopenharmony_ci    DWORD dwCopyright;
607159b3361Sopenharmony_ci    m_pAEProps->get_CopyrightFlag(&dwCopyright);
608159b3361Sopenharmony_ci    CheckDlgButton(hwndParent, IDC_CHECK_COPYRIGHT, dwCopyright ? BST_CHECKED : BST_UNCHECKED);
609159b3361Sopenharmony_ci
610159b3361Sopenharmony_ci    DWORD dwOriginal;
611159b3361Sopenharmony_ci    m_pAEProps->get_OriginalFlag(&dwOriginal);
612159b3361Sopenharmony_ci    CheckDlgButton(hwndParent, IDC_CHECK_ORIGINAL, dwOriginal ? BST_CHECKED : BST_UNCHECKED);
613159b3361Sopenharmony_ci}
614159b3361Sopenharmony_ci
615159b3361Sopenharmony_ci
616159b3361Sopenharmony_ci////////////////////////////////////////////////////////////////
617159b3361Sopenharmony_ci// EnableControls
618159b3361Sopenharmony_ci////////////////////////////////////////////////////////////////
619159b3361Sopenharmony_civoid CMpegAudEncPropertyPage::EnableControls(HWND hwndParent, bool bEnable)
620159b3361Sopenharmony_ci{
621159b3361Sopenharmony_ci    EnableWindow(GetDlgItem(hwndParent, IDC_CHECK_PES), false);//bEnable);
622159b3361Sopenharmony_ci    EnableWindow(GetDlgItem(hwndParent, IDC_RADIO_CBR), bEnable);
623159b3361Sopenharmony_ci    EnableWindow(GetDlgItem(hwndParent, IDC_COMBO_CBR), bEnable);
624159b3361Sopenharmony_ci    EnableWindow(GetDlgItem(hwndParent, IDC_RADIO_VBR), bEnable);
625159b3361Sopenharmony_ci    EnableWindow(GetDlgItem(hwndParent, IDC_COMBO_VBRMIN), bEnable);
626159b3361Sopenharmony_ci    EnableWindow(GetDlgItem(hwndParent, IDC_COMBO_VBRMAX), bEnable);
627159b3361Sopenharmony_ci    EnableWindow(GetDlgItem(hwndParent, IDC_CHECK_COPYRIGHT), bEnable);
628159b3361Sopenharmony_ci    EnableWindow(GetDlgItem(hwndParent, IDC_CHECK_ORIGINAL), bEnable);
629159b3361Sopenharmony_ci    EnableWindow(GetDlgItem(hwndParent, IDC_CHECK_CRC), bEnable);
630159b3361Sopenharmony_ci    EnableWindow(GetDlgItem(hwndParent, IDC_FORCE_MONO), bEnable);
631159b3361Sopenharmony_ci    EnableWindow(GetDlgItem(hwndParent, IDC_SLIDER_QUALITY), bEnable);
632159b3361Sopenharmony_ci    EnableWindow(GetDlgItem(hwndParent, IDC_COMBO_SAMPLE_RATE), bEnable);
633159b3361Sopenharmony_ci}
634159b3361Sopenharmony_ci
635159b3361Sopenharmony_ci//
636159b3361Sopenharmony_ci// SetDirty
637159b3361Sopenharmony_ci//
638159b3361Sopenharmony_ci// notifies the property page site of changes
639159b3361Sopenharmony_ci
640159b3361Sopenharmony_civoid CMpegAudEncPropertyPage::SetDirty()
641159b3361Sopenharmony_ci{
642159b3361Sopenharmony_ci    m_bDirty = TRUE;
643159b3361Sopenharmony_ci    if (m_pPageSite)
644159b3361Sopenharmony_ci        m_pPageSite->OnStatusChange(PROPPAGESTATUS_DIRTY);
645159b3361Sopenharmony_ci}
646159b3361Sopenharmony_ci
647