The best way to do this would be to have your 3 classes be subclasses of a GenericAudio class:
class GenericAudio
{
virtual void play_audio() abstract;
}
class MP3Audio : public GenericAudio
{
virtual void play_audio();
...
}
class WavAudio : public GenericAudio
{
virtual void play_audio();
...
}
class SelfGenAudio : public GenericAudio
{
virtual void play_audio();
...
}
Then your linked list can be a linked list of GenericAudio's and you can call play_audio() on each object without caring what specific sub-class it is.
Any other functionality that is common to the three classes you should also declare as virtual in GenericAudio, so you just write all the rest of your code to use a GenericAudio object.
If for some reason you think you need to know what sub-type some GenericAudio is, you can always test for it -- but probably that means you need to add another virtual function to GenericAudio so that you don't have to care.
Doing it that way, if you find you need to add another audio type later, you just add another sub-class of GenericAudio and all the rest of the code just works.