Solved

getting length of  a  wav file

Posted on 1998-05-31
2
292 Views
Last Modified: 2010-08-05
I know it is possible to get the length of a wav file (in milleseconds or seconds) but have not been able to do it.  Below is a function that is supposed to return the length of a wave file (IT DOESN'T WORK... IT RETURNS 0.0 EVERY TIME).  The code uses MCI_WAVE_OPEN_PARMS and mciSendCommand() to open a file (which it does with out error) but the dwBufferSeconds member of MCI_WAVE_OPEN_PARMS is always 0.0 after opening the wav.  Am I wrong in assuming that dwBufferSeconds should hold the length of the wav file opened or am I missing a needed flag or something?  Does somebody know what I am doing wrong or know of another way to get the length of a wav file?  Thanks.

// Function takes LPSTR pointer to string containing the
// path to a wave file, returns length of wave file
long CPlaywaveDlg::GetWavLengthSeconds(LPSTR wavPath)
{       // wavPath points to string containing wave file path
      MCI_WAVE_OPEN_PARMS mciOpenParms;
      
      DWORD mciError, mciFlags;
      int wDeviceID;
#define BUF_LEN 256
      char mciErrorString[BUF_LEN];

      //Initialize data structures...
      mciOpenParms.dwCallback = 0;  // no callback
      mciOpenParms.wDeviceID = 0;  
      mciOpenParms.lpstrDeviceType = "waveaudio";
      mciOpenParms.lpstrElementName = wavPath;
      mciOpenParms.lpstrAlias= NULL;       // no alias
      mciOpenParms.dwBufferSeconds = 0L;  
      mciFlags = MCI_OPEN_TYPE | MCI_OPEN_ELEMENT

      // Send the open command
      mciError = mciSendCommand(0, MCI_OPEN, mciFlags, (DWORD)&mciOpenParms);
      if (!mciError)
      {

            // if open was successful, retrieve the length
            double secs = mciOpenParms.dwBufferSeconds;
               
            mciError = mciSendCommand(wDeviceID, MCI_CLOSE, 0, 0L); // close the file
            }
      

            return secs;  // return the length

      }
      else
      {
            int dummy = mciGetErrorString(mciError, mciErrorString, BUF_LEN);
            
            CString errorMsg = "Media Control Interface Error ";
            errorMsg += mciErrorString;
            MessageBox(errorMsg, "Error", MB_ICONSTOP);
      }
      return -999;  // error

}

0
Comment
Question by:cww1
2 Comments
 

Author Comment

by:cww1
ID: 1164999
Edited text of question
0
 
LVL 3

Accepted Solution

by:
tma050898 earned 100 total points
ID: 1165000
cww1,

I only have a minute to post this so I'm tryig to copy & paste this out of my code very quickly. Try this and if it doesn't work I'll take a little more time when I get back home...

// Get Minutes...
MCI_STATUS_PARMS StatusParms;
StatusParms.dwItem = MCI_STATUS_POSITION;
mciSendCommand( m_wDeviceID, MCI_STATUS, MCI_WAIT | MCI_STATUS_ITEM, (DWORD)(LPVOID) &StatusParms);

iMinutes = ((int)((StatusParms.dwReturn / 1000) / 60 ));


// Get seconds...
MCI_STATUS_PARMS StatusParms;
StatusParms.dwItem = MCI_STATUS_POSITION;
mciSendCommand( m_wDeviceID, MCI_STATUS, MCI_WAIT | MCI_STATUS_ITEM, (DWORD)(LPVOID) &StatusParms);

iSeconds = (int)((StatusParms.dwReturn / 1000 ) % 60 ));

Tom
0

Featured Post

Free Tool: Subnet Calculator

The subnet calculator helps you design networks by taking an IP address and network mask and returning information such as network, broadcast address, and host range.

One of a set of tools we're offering as a way of saying thank you for being a part of the community.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

In days of old, returning something by value from a function in C++ was necessarily avoided because it would, invariably, involve one or even two copies of the object being created and potentially costly calls to a copy-constructor and destructor. A…
Basic understanding on "OO- Object Orientation" is needed for designing a logical solution to solve a problem. Basic OOAD is a prerequisite for a coder to ensure that they follow the basic design of OO. This would help developers to understand the b…
The viewer will learn additional member functions of the vector class. Specifically, the capacity and swap member functions will be introduced.
The viewer will be introduced to the member functions push_back and pop_back of the vector class. The video will teach the difference between the two as well as how to use each one along with its functionality.

821 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question