Wave File Editor Control

WaveEdit.gif (4565 bytes)

This WaveFile manipulation control provides a  basic interface for displaying and editing wave files within a commercial audio-processing application. The app contains code on displaying the graphical data, using button logic and rudimentary mouse input to manipulate the waveform data. Thanks go to Ken C. Len's Histogram Control for providing much of the underlying control code.

In this sample I simply use random values to generate the waveform amplitude. In a real-world application you would load/record a wave file and gain access to the individual sound samples through the waveform audio or other low-level audio API. Mouse input is still basic at this point but could be easily embellished to allow caret dragging across portions of the waveform - for cut/copy/paste etc..

The header and implementation code for the CWaveEditCtrl class are in WaveEditCtrl.h and WaveEditCtrl.cpp

How to use

In your dialog box, dialog derived, or CFromView MDI/SDI derived app - create a static picture control. Give it a meaningful name and set its' properties to Rectangle and give it a Background color (sorry, we're limited to Ford colors from the 1930's here). Add the .h and .cpp files to your project and #include the .h in your app's header file.

Declare an object of type CWaveEditCtrl like so:


class CWaveEditorView : public CFormView
{
protected:
	CWaveEditCtrl m_WaveEditCtrl;
...
};

and in your view's OnInitialUpdate() function (this will differ for dialog-based apps) add the following control creation code:


void CWaveEditorView::OnInitialUpdate()
{
	CFormView::OnInitialUpdate();

	CRect rect;
	GetDlgItem(IDC_WAVE_EDIT)->GetWindowRect(rect);
	ScreenToClient(rect);
	m_WaveEditCtrl.Create(WS_VISIBLE | WS_CHILD, rect, this, 1000);

Don't forget to add OnSetFocus() and OnKillFocus() handlers to your view with the appropriate CWaveEditCtrl member function calls  - this will enable system-wide sharing of  the caret resource.

Note - When using the CWaveEdit class within a Dialog-based application I had some problems getting OnSetFocus() to respond. If anyone knows how to fix this, please let me know.

Download source and demo project - 50KB



Comments

  • Solution for dialog-based apps

    Posted by Legacy on 06/25/1999 12:00am

    Originally posted by: Beno�t Bousquet

    I found that using OnActivate does the work for dialog-based applications. Here's the code snippet:
    
    

    void DlgAudioPlayer::OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized)
    {
    CDialog::OnActivate(nState, pWndOther, bMinimized);

    switch(nState) {
    case WA_INACTIVE :
    m_WeWaveForm.KillCaret();
    break;
    case WA_ACTIVE :
    case WA_CLICKACTIVE:
    m_WeWaveForm.SetCaret ();
    break;
    default:
    break;
    }
    }// OnActivate

    Reply
  • Re: ASSERT fail when "CLOSE" multiple selection - MDI status bar

    Posted by Legacy on 05/12/1999 12:00am

    Originally posted by: Cristiano Bruno

    Hi,
    
    I was trying the solution submitted by Hamond Hau, but I have the same problems with the OnClose method.
    I modified a little bit the code of Iuri, and now it seems that it's working.
    In the file WinListDlg.cpp, you can replace in the OnClose method the following lines:
    ---------
    for (int t = 0; t < iCount; t++)
    {
    int item = wndList.GetItemData(pi[t]);
    ((CView *) theViewManager.arViews.GetAt(item))->GetParent()->SendMessage(WM_CLOSE);
    }
    delete [] pi;
    ----------

    With the lines:
    ----------
    for (int t = 0; t < iCount; t++)
    {
    int item = wndList.GetItemData(pi[t]);
    lView[t] = ((CView *) theViewManager.arViews.GetAt(item));
    }
    delete [] pi;
    for(t = 0; t < iCount; t++)
    {
    CView * v = lView[t];
    if ((v != NULL)&&(v->GetSafeHwnd() != 0))
    v->GetParent()->SendMessage(WM_CLOSE);
    }
    free(lView);

    Do not forget to initialise lView (in the beginning of OnClose):
    int iCount = wndList.GetSelCount();
    CView** lView;
    lView = (CView**)malloc(iCount*sizeof(CView*));

    Ok, my solution adds a little delay in the OnClose method. In the case of my application, it is just one or two second to close 20 Views.

    Best regards,
    Thank you Hamond and Iuri

    Reply
Leave a Comment
  • Your email address will not be published. All fields are required.

Top White Papers and Webcasts

  • Microsoft® Office 365 is a top choice for enterprises that want a cloud-based suite of productivity/ collaboration applications. With Office 365, you get access to Microsoft™ Office solutions practically anytime, anywhere, on virtually any device. It's a great option for current Microsoft users who can now build on their experience with Microsoft™ solutions while enjoying the flexibility of a cloud-based delivery. But even organizations with no previous investment in Microsoft will find that …

  • More than ever, agile Software Life Cycle Development and DevOps drives critical top-line business impact for customers across a broad range of industries. Learn how XtremIO is fundamentally enabling the next generation of agile Software Development & DevOps to: Radically improve developer efficiency and overall product quality via an All-Flash Dev Ops platform Enable modern lightning fast dev methodologies with zero-cost application & datasets full copies. Allow Developers to have zero storage obstacles, …

Most Popular Programming Stories

More for Developers

RSS Feeds

Thanks for your registration, follow us on our social networks to keep up-to-date