Changeset 7


Ignore:
Timestamp:
Aug 26, 2011, 1:20:52 AM (10 years ago)
Author:
roman
Message:

sine wave generation

Location:
trunk/Utilities/GeneratePcmWavFile
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/Utilities/GeneratePcmWavFile/GeneratePcmWavFile.cpp

    r5 r7  
    113113                        CEvent m_MediaSampleTimeEvent;
    114114                        REFERENCE_TIME m_nMediaSampleTime;
     115                        SIZE_T m_nCurrentSampleIndex;
    115116
    116117                public:
     
    118119                        CThreadContext(CEvent& TerminationEvent) throw() :
    119120                                CPushSourceFilter::CThreadContext(TerminationEvent),
    120                                 m_nMediaSampleTime(0)
     121                                m_nMediaSampleTime(0),
     122                                m_nCurrentSampleIndex(0)
    121123                        {
    122124                        }
     
    144146                        CMediaType m_pDataMediaType;
    145147                        REFERENCE_TIME m_nDataLength;
     148                        DOUBLE m_fSignalPeriod;
     149                        DOUBLE m_fSignalAmplitude;
    146150
    147151                public:
    148152                // COutputPin
    149153                        COutputPin() throw() :
    150                                 m_nDataLength(0)
     154                                m_nDataLength(0),
     155                                m_fSignalPeriod(0),
     156                                m_fSignalAmplitude(0)
    151157                        {
    152158                                _Z4(atlTraceRefcount, 4, _T("this 0x%p\n"), this);
     
    195201                                return TRUE;
    196202                        }
     203                        VOID InitializeThread(CThreadContext& ThreadContext) throw()
     204                        {
     205                                CRoCriticalSectionLock DataLock(GetDataCriticalSection());
     206                                __super::InitializeThread(ThreadContext);
     207                                if(m_fSignalPeriod > 0)
     208                                {
     209                                        __D(m_pDataMediaType.GetWaveFormatEx()->wBitsPerSample == 16, E_NOTIMPL);
     210                                        ThreadContext.m_nCurrentSampleIndex = 0;
     211                                }
     212                        }
    197213                        BOOL ComposeMediaSample(CThreadContext& ThreadContext, IMediaSample* pMediaSample)
    198214                        {
     
    210226                                nDataSize = (nDataSize / pWaveFormatEx->nBlockAlign) * pWaveFormatEx->nBlockAlign;
    211227                                if(pWaveFormatEx->wBitsPerSample == 8)
     228                                {
    212229                                        FillMemory(Properties.pbBuffer, nDataSize, 0x80);
    213                                 else
     230                                } else
     231                                {
    214232                                        ZeroMemory(Properties.pbBuffer, nDataSize);
     233                                        #pragma region Size Wave Data
     234                                        if(m_fSignalPeriod > 0)
     235                                        {
     236#if _DEVELOPMENT
     237                                                const SIZE_T nAnchorCurrentSampleIndex = ThreadContext.m_nCurrentSampleIndex;
     238#endif // _DEVELOPMENT
     239                                                for(SIZE_T nIndex = 0; nIndex < nDataSize; nIndex += pWaveFormatEx->nBlockAlign)
     240                                                {
     241                                                        const SHORT nValue = (SHORT) (m_fSignalAmplitude * sin(2 * M_PI * ThreadContext.m_nCurrentSampleIndex++ / m_fSignalPeriod));
     242                                                        SHORT* pnSampleData = (SHORT*) (Properties.pbBuffer + nIndex);
     243                                                        for(WORD nChannelIndex = 0; nChannelIndex < pWaveFormatEx->nChannels; nChannelIndex++)
     244                                                                pnSampleData[nChannelIndex] = nValue;
     245                                                }
     246#if _DEVELOPMENT
     247                                                _A(ThreadContext.m_nCurrentSampleIndex == nAnchorCurrentSampleIndex + nDataSize / pWaveFormatEx->nBlockAlign);
     248#endif // _DEVELOPMENT
     249                                        }
     250                                        #pragma endregion
     251                                }
    215252                                ThreadContext.m_nMediaSampleTime += nDataSize * (1000 * 10000i64) / pWaveFormatEx->nAvgBytesPerSec;
     253                                //ThreadContext.m_nCurrentSampleIndex += nDataSize / pWaveFormatEx->nBlockAlign;
    216254                                Properties.lActual = (LONG) nDataSize;
    217255                                Properties.Set();
     
    226264                                m_nDataLength = nLength;
    227265                        }
     266                        VOID InitializeSignal(DOUBLE fSignalPeriod, DOUBLE fSignalAmplitude)
     267                        {
     268                                __D(fSignalPeriod > 0 && fSignalAmplitude >= 0, E_INVALIDARG);
     269                                m_fSignalPeriod = fSignalPeriod;
     270                                m_fSignalAmplitude = fSignalAmplitude;
     271                        }
    228272                };
    229273
     
    299343                        m_pOutputPin->InitializeData(pWaveFormatEx, nLength);
    300344                }
     345                VOID InitializeSignal(DOUBLE fSignalAmplitude, DOUBLE fSignalPeriod)
     346                {
     347                        m_pOutputPin->InitializeSignal(fSignalAmplitude, fSignalPeriod);
     348                }
    301349        };
    302350
     
    304352        CWaveFormatEx m_WaveFormatEx;
    305353        REFERENCE_TIME m_nLength;
     354        UINT m_nSignalFrequency;
     355        UINT m_nSignalLoudness;
    306356        CPath m_sPath;
    307357
     
    316366                ZeroMemory(&m_WaveFormatEx, sizeof m_WaveFormatEx);
    317367                m_nLength = 0;
     368                m_nSignalFrequency = 0;
     369                m_nSignalLoudness = 0;
    318370        }
    319371        ~CModule() throw()
     
    340392                __D(nLength > 0, E_INVALIDARG);
    341393                m_nLength = nLength;
     394        }
     395        VOID SetSignalFrequency(UINT nSignalFrequency)
     396        {
     397                __D(nSignalFrequency > 0, E_INVALIDARG);
     398                m_nSignalFrequency = nSignalFrequency;
     399        }
     400        VOID SetSignalLoudness(UINT nSignalLoudness)
     401        {
     402                __D(nSignalLoudness >= 0, E_INVALIDARG);
     403                m_nSignalLoudness = nSignalLoudness;
    342404        }
    343405        VOID SetPath(LPCTSTR pszPath)
     
    362424                        _tprintf(_T("  /b:N: Sample Bit Count N, 8 or 16\n"));
    363425                        _tprintf(_T("  /t:N: Length N, seconds\n"));
     426                        _tprintf(_T("  /f:N: Sine Signal Frequency N, Hz\n"));
     427                        _tprintf(_T("  /l:N: Sine Signal Loudness N, dB below full scale\n"));
    364428                        __C(S_FALSE);
    365429                }
     
    377441                CObjectPtr<CSourceFilter> pSourceFilter;
    378442                pSourceFilter.Construct()->Initialize(pWaveFormatEx, m_nLength);
     443                if(m_nSignalFrequency)
     444                {
     445                        __D(m_WaveFormatEx.wBitsPerSample == 16, E_NOTIMPL);
     446                        const DOUBLE fSignalPeriod = (DOUBLE) pWaveFormatEx->nSamplesPerSec / m_nSignalFrequency;
     447                        const DOUBLE fSignalAmplitude = 32767.0 / pow(10.0, m_nSignalLoudness / 20.0);
     448                        pSourceFilter->InitializeSignal(fSignalPeriod, fSignalAmplitude);
     449                }
    379450                __C(GenericFilterGraph->AddFilter(pSourceFilter, CT2CW(_T("Source"))));
    380451                CComPtr<IPin> pCurrentOutputPin = pSourceFilter->GetOutputPin();
     
    474545                                        //_tprintf(_T("Option: Length, %d\n"), nIntegerArgumentValue);
    475546                                        Module.SetLength(nIntegerArgumentValue * 1000 * 10000i64);
     547                                } else
     548                                if(_tcschr(_T("Ff"), sArgument[0])) // Sine Signal Frequency, Hz
     549                                {
     550                                        __D(bIntegerArgumentValueValid, E_INVALIDARG);
     551                                        //_tprintf(_T("Option: Sine Signal Frequency, %d\n"), nIntegerArgumentValue);
     552                                        Module.SetSignalFrequency(nIntegerArgumentValue);
     553                                } else
     554                                if(_tcschr(_T("Ll"), sArgument[0])) // Sine Signal Loudness, dB below FS
     555                                {
     556                                        __D(bIntegerArgumentValueValid, E_INVALIDARG);
     557                                        //_tprintf(_T("Option: Sine Signal Loudness, %d\n"), nIntegerArgumentValue);
     558                                        Module.SetSignalLoudness(nIntegerArgumentValue);
    476559                                }
    477560                                continue;
  • trunk/Utilities/GeneratePcmWavFile/stdafx.h

    r5 r7  
    1212#include "targetver.h"
    1313
     14#define _USE_MATH_DEFINES
     15
    1416#include <stdio.h>
    1517#include <tchar.h>
     18#include <math.h>
    1619
    1720////////////////////////////////////////////////////////////
Note: See TracChangeset for help on using the changeset viewer.