This article is an improved edition of my article: Play Wave Files with DirectSound and Display its Spectrum in Real Time - Part 2. In this article, I add MP3, WMA, WAV, and OGG Vorbis support, which need Windows Media 9 or higher support, and I do some extra work to reorganize code. Here have two articles were posted on Code Project before this article, they are listed below.
The input stream includes file, CD, microphone and so on. In this article, the input stream is audio file. So, I define
CInput as base classes for all input types, and have some pure virtual functions defined in this class. The function
GetDataInternal must be implemented by derived class, which reads audio data from audio file and fills it to a buffer.
In this article, I use WMF (Windows Media Format) decodes WMA format. The main interfaces that were used are
IWMSyncReader interface provides the ability to read WMA files using synchronous calls. The
INSSBuffer interface is the basic interface of a buffer object. A buffer object is a wrapper around a memory buffer. The methods exposed by this interface are used to manipulate the buffer. The
IWMHeaderInfo interface sets and retrieves information in the header section of an ASF file. You can manipulate three types of header information by using the methods of this interface: metadata attributes, markers, and script commands. You can read MSDN for more information.
The libraries like libmad, libogg and libvorbis are all integrated in this application. And I defined four classes for MP3, WMA, WAV and OGG Vorbis files reading, these are
CVorbisIn. For more details, please read the code.
The application decodes mp3 files with libmad, it does not depend on WMF (Windows Media Format) anymore, this library is so cool, I like it.
This component already implemented in Play Wave Files with DirectSound and Display its Spectrum in Real Time - Part 2 uses DirectSound for output. So, if you have some questions about it, you should read it first. You can also search CodeProject with the keyword
DirectSound; you will get many articles about it.
I would always feel that the spectrum displayed in the window is not right, especially when playing some sound files. So, I hope I can get help on that, and thoroughly deal with it.
There have some bugs that exist in the article Play Wave Files with DirectSound and Display its Spectrum in Real Time - Part 2. I have done a lot of work to fix it. There may exist unknown bugs, which require time to find. If you find any, let me know. Thanks.
- 23th December, 2008: New version is posted, which supports mp3, wav, wma, and ogg. The another important thing is what decodes mp3 files with libmad without depends on WMF (Windows Media Format) anymore.
- 12th December, 2008: Initial post