Ah, memories... I was so young then

The code in that thread was written pre-"decoding channels", so it can actually be improved quite a bit...
#include <windows.h>
#include <stdio.h>
#include <conio.h>
#include "bass.h"
void Error(char *text)
{
printf("Error(%d): %s\n",BASS_ErrorGetCode(),text);
BASS_Free();
ExitProcess(0);
}
typedef struct {
HSTREAM str,rstr;
int flags,dpos,buflen,bufp;
char *buf;
} REVERSESTUFF;
/* play stream in reverse */
DWORD CALLBACK rev_stream(HSTREAM handle, DWORD *buffer, DWORD length, REVERSESTUFF *r)
{
int a,c,l=length;
while (l) {
if (!r->bufp) { /* decode the next block */
if (r->dpos<=0) break; // all done
r->dpos-=r->buflen; // move to next block position
if (r->dpos<0) { // it's the last block
BASS_ChannelSetPosition(r->str,0);
r->bufp=BASS_ChannelGetData(r->str,r->buf,r->buflen+r->dpos);
} else {
BASS_ChannelSetPosition(r->str,r->dpos);
r->bufp=BASS_ChannelGetData(r->str,r->buf,r->buflen);
}
if (r->bufp<=0) break; // error
}
/* reverse the decoded data */
c=min(l,r->bufp);
if (r->flags&BASS_SAMPLE_MONO) {
short *b=buffer;
for (a=0;a<c/2;a++) {
*b=*(short*)(r->buf+r->bufp-2);
b++;
r->bufp-=2;
}
} else {
for (a=0;a<c/4;a++) {
*buffer=*(DWORD*)(r->buf+r->bufp-4);
buffer++;
r->bufp-=4;
}
}
l-=c;
}
return length-l;
}
void main(int argc, char **argv)
{
REVERSESTUFF r;
int freq;
if (argc!=2) {
printf("\tusage: reverse <file>\n");
return;
}
/* setup output - default device, 44100hz, stereo, 16 bits */
if (!BASS_Init(-1,44100,BASS_DEVICE_NOSYNC,0))
Error("Can't initialize device");
/* try streaming the file (with pin-point seeking enabled) */
if (!(r.str=BASS_StreamCreateFile(FALSE,argv[1],0,0,BASS_STREAM_DECODE|BASS_MP3_SETPOS)))
Error("Can't play the file");
/* get stream format and create new stream to play in reverse */
r.flags=BASS_ChannelGetFlags(r.str)&~BASS_STREAM_DECODE;
BASS_ChannelGetAttributes(r.str,&freq,0,0);
r.rstr=BASS_StreamCreate(freq,r.flags,(STREAMPROC*)&rev_stream,&r);
/* decode in 2 second blocks...
larger blocks = less seeking overhead but larger spikes */
r.buflen=BASS_ChannelSeconds2Bytes(r.str,2.0);
r.buf=malloc(r.buflen);
BASS_Start();
/* set decode position to the start (ie. end) */
r.dpos=BASS_StreamGetLength(r.str);
r.bufp=0;
BASS_StreamPlay(r.rstr,FALSE,0); // start it
while (!_kbhit() && BASS_ChannelIsActive(r.rstr)) {
/* display some stuff and wait a bit */
printf("pos %09d - cpu %.1f%% \r",
BASS_ChannelGetPosition(r.rstr),BASS_GetCPU());
Sleep(50);
}
BASS_Free();
free(r.buf);
}
Simpler, smaller, more efficient, more robust... better

By the way, what don't you like about the search option?