Hi,
i'm currently implement ogg vorbis real time decoder.
For that, i wrote a ToggVorbisStream that extends of TWave.
I overrided Read And Seek methods and decoding and playing sound is ok.

But I was obliged to modify TStockAudioPlayer.GetWaveFormat to get the wave format of my ogg file.

So, Kambiz, I would like change TStockAudioPlayer or descendants so that all that relates to the wave is managed by a TWave or TAbstractWave or an interface for wave objects with methods: ReadWaveData, WriteWaveData, SeekInWave, and LoadWaveFormat, and possibly Open and Close that can be called from MMIOM_OPEN and MMIOM_CLOSE.
Not Read and Write because it oblige to override it, put decoding code on it and write InternalRead, ... to read the real stream (ogg vorbis file).
Obviously, in this case, ReadWaveData will must call directly TWave.Read.

Firstly, I overrided UpdateDetail (i was obliged to put private variables of TWave to protected) but I realized that this method was not used: only TStockAudioPlayer.GetWaveFormat was used.

What is a ogg vorbis real time decoder?
I am using the GSM codec. For that I made a TCompressedPlayer using TLiveAudioPlayer and a TCompressedRecorder using a TLiveAudioRecorder.
There is no need to change WaveAudio components for that, although it would be nice that inherited components for the use of CODECs will be added to the pack. : )
With kind regards,

Hi Edwin,
ogg vorbis is a codec like mp3 (www.vorbis.com) and his advantage that API is more simple to use that mp3 (mpglib+lame) and the same api can encode and decode, and propose static library. Moreover, I use voice encoding and mp3 with bad quality posed many problems to me.

I ve to say by real time the fact of decode compressed file on mmio demand and not decode the entire ogg file to put decoded wave data to twave object.
(realtime, I think that it's you do)

Indeed, we can use TLiveAudioPlayer to do that but I think that is better to use a class that do interface between wave data and playback, moreover, seeking and wave writing is already wrote in pack.

Thereafter I want to write encoding by overriding Write method or other if modification.

Edwin,
I don't use acm, now I use dynamic libraries(dll) and thereafter, I want to use static libraries (lib or obj) to produce only one exe (without dll or acm that i beleive must be installed).

Indeed, there is two point of view but I insist, if we separe audio data (WaveStorage) and audio playing (other files), as It's already done at 99%
(1%=TStockAudioPlayer.GetWaveFormat that use GetWaveAudioInfo directly without use TWave Stream), and if audio data class (Twave) is modify to use codec,
we will be able to create, only one object that herit of Twave or IAbstractWave to do encoding, decoding and seeking, and also we will be able use this object in all Players (TAudioPlayer and TStockAudioPlayer, idem for recorders).

Add to this, we will also add a RegisterClass system that can purpose to TAudioPlayer and TStockAudioPlayer to chose between wave or differents codecs installed in delphi).

The "problem" is that TStockAudioPlayer was wrote to use every type of stream directly, and not Twave and TWaveStorage only.
So, if somebody use TStockAudioPlayer without use Twave or TWaveStorage object, it's can be a problem to change it.

Now, we must to wait for Kambiz reply, only the boss can tell us how we can do.