forked from KolibriOS/kolibrios
restore old ac97wav.c
git-svn-id: svn://kolibrios.org@577 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
268f6d98b7
commit
94ec5d65c8
@ -19,24 +19,13 @@
|
|||||||
#include "../mpg/mpg123.h"
|
#include "../mpg/mpg123.h"
|
||||||
#include "../sound.h"
|
#include "../sound.h"
|
||||||
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
int sender;
|
|
||||||
int size;
|
|
||||||
int code;
|
|
||||||
char data[1];
|
|
||||||
} IPC;
|
|
||||||
|
|
||||||
int ipc_client = 0;
|
|
||||||
|
|
||||||
#define MP3_ERROR_OUT_OF_BUFFER 5
|
#define MP3_ERROR_OUT_OF_BUFFER 5
|
||||||
int m_last_error;
|
int m_last_error;
|
||||||
|
|
||||||
void _stdcall thread_proc(void *param);
|
void _stdcall thread_proc(void *param);
|
||||||
void _stdcall create_thread(void *proc, void *param, int stack_size);
|
void _stdcall create_thread(void *proc, void *param, int stack_size);
|
||||||
void _stdcall init_ipc(void);
|
|
||||||
void _stdcall send_ipc(int dst, DWORD code);
|
void _stdcall send_ipc(int dst, DWORD code);
|
||||||
IPC * _stdcall recieve_ipc(void);
|
|
||||||
|
|
||||||
void touch(char *buf, int size);
|
void touch(char *buf, int size);
|
||||||
int mp3FindSync(byte* buf, int size, int* sync);
|
int mp3FindSync(byte* buf, int size, int* sync);
|
||||||
@ -47,16 +36,9 @@ char *fname;
|
|||||||
struct reader rd;
|
struct reader rd;
|
||||||
struct frame fr;
|
struct frame fr;
|
||||||
|
|
||||||
void draw_window();
|
|
||||||
void draw_progress_bar();
|
|
||||||
void do_ipc();
|
|
||||||
void exit();
|
|
||||||
|
|
||||||
|
|
||||||
DWORD hDrv;
|
DWORD hDrv;
|
||||||
DWORD hSound;
|
DWORD hSound;
|
||||||
SNDBUF hBuff;
|
SNDBUF hBuff;
|
||||||
volatile int snd_init=0;
|
|
||||||
|
|
||||||
CTRL_INFO info;
|
CTRL_INFO info;
|
||||||
|
|
||||||
@ -68,7 +50,6 @@ int r_vol=-700;
|
|||||||
int pan =0;
|
int pan =0;
|
||||||
|
|
||||||
DWORD status;
|
DWORD status;
|
||||||
DWORD offset;
|
|
||||||
DWORD first_sync;
|
DWORD first_sync;
|
||||||
|
|
||||||
unsigned char *testbuff;
|
unsigned char *testbuff;
|
||||||
@ -81,108 +62,310 @@ int outsize;
|
|||||||
int outremain;
|
int outremain;
|
||||||
int totalout;
|
int totalout;
|
||||||
int done;
|
int done;
|
||||||
char path[1024];
|
|
||||||
char header[] = "AC97 MP3 player";
|
char header[] = "AC97 MP3 player";
|
||||||
char buttons_text[]=" Play Stop << >> Vol- Vol+";
|
char buttons_text[]=" Play Stop << >> Vol- Vol+";
|
||||||
|
|
||||||
void (*snd_play)();
|
void (*snd_play)();
|
||||||
|
|
||||||
|
void draw_window()
|
||||||
|
{
|
||||||
|
BeginDraw();
|
||||||
|
|
||||||
|
DrawWindow(100,100,299,72,0x404040,3,0,0,0);
|
||||||
|
|
||||||
|
make_button(7,24,45,13, 0x10|BT_NORMAL,0x808080);
|
||||||
|
make_button(56,24,45,13, 0x11|BT_NORMAL,0x808080);
|
||||||
|
make_button(104,24,45,13, 0x12|BT_NORMAL,0x808080);
|
||||||
|
make_button(152,24,45,13, 0x13|BT_NORMAL,0x808080);
|
||||||
|
make_button(200,24,45,13, 0x14|BT_NORMAL,0x808080);
|
||||||
|
make_button(248,24,45,13, 0x15|BT_NORMAL,0x808080);
|
||||||
|
|
||||||
|
make_button(7,41,286,11, 0x30|BT_HIDE|BT_NOFRAME,0x404040);
|
||||||
|
draw_bar(7,41,286,11,0x404040);
|
||||||
|
|
||||||
|
draw_bar(7,55,286,11,0x404040);
|
||||||
|
write_text(12,58,0x004000|FONT0, fname, strlen(fname));
|
||||||
|
write_text(11,57,0x00FF20|FONT0, fname, strlen(fname));
|
||||||
|
|
||||||
|
write_text(8,8,0xFFFFFF|FONT0, header, strlen(header));
|
||||||
|
write_text(12,28,0x404040|FONT0,buttons_text,strlen(buttons_text));
|
||||||
|
write_text(11,27,0xA0FFA0|FONT0,buttons_text,strlen(buttons_text));
|
||||||
|
|
||||||
|
EndDraw();
|
||||||
|
};
|
||||||
|
|
||||||
|
void draw_progress_bar()
|
||||||
|
{ DWORD x;
|
||||||
|
x = 287.0f * (float)(rd.filepos-rd.strremain)/(float)fileinfo.size;
|
||||||
|
if(x==0) return;
|
||||||
|
draw_bar(7,41,x,11,0xA0A0A0);
|
||||||
|
draw_bar(x+7,41,287-x,11,0x404040);
|
||||||
|
};
|
||||||
|
|
||||||
|
void debug_out_str(char* str)
|
||||||
|
{
|
||||||
|
while (*str != 0)
|
||||||
|
{
|
||||||
|
debug_out(*str);
|
||||||
|
str++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int main(int argc, char *argv[]) //int argc, char *argv[])
|
int main(int argc, char *argv[]) //int argc, char *argv[])
|
||||||
{
|
{
|
||||||
|
DWORD fmt;
|
||||||
|
DWORD r_bytes;
|
||||||
|
int retval;
|
||||||
int err;
|
int err;
|
||||||
int ver;
|
int ver;
|
||||||
int evnt;
|
|
||||||
int key;
|
|
||||||
int pos;
|
|
||||||
int msg;
|
|
||||||
int cnt;
|
|
||||||
IPC *incom;
|
|
||||||
|
|
||||||
_asm
|
fname = argv[1];
|
||||||
{
|
debug_out_str("\n\rPlay file ");
|
||||||
mov eax, 40
|
debug_out_str(fname);
|
||||||
mov ebx, 0x47 ;recieve ipc
|
debug_out_str("\n\r");
|
||||||
int 0x40
|
|
||||||
mov eax, 66
|
InitHeap(1024*1024);
|
||||||
mov ebx, 1
|
if(get_fileinfo(fname, &fileinfo)==FILE_NOT_FOUND)
|
||||||
mov ecx, 1
|
{ debug_out_str("\n\rfile not found\n\r");
|
||||||
int 0x40
|
return 0;
|
||||||
};
|
};
|
||||||
init_ipc();
|
|
||||||
InitHeap(0);
|
|
||||||
|
|
||||||
if(err = InitSound(&ver))
|
if(err = InitSound(&ver))
|
||||||
{ debug_out_str("Sound service not installed\n\r");
|
{
|
||||||
|
debug_out_str("Sound service not installed\n\r");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( (SOUND_VERSION>(ver&0xFFFF)) ||
|
if( (SOUND_VERSION>(ver&0xFFFF)) ||
|
||||||
(SOUND_VERSION<(ver >> 16)))
|
(SOUND_VERSION<(ver >> 16)))
|
||||||
{ debug_out_str("Sound service version mismatch\n\r");
|
{
|
||||||
|
debug_out_str("Sound service version mismatch\n\r");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
make_decode_tables(32767);
|
testbuff = UserAlloc(4096);
|
||||||
init_layer2();
|
|
||||||
init_layer3(32);
|
|
||||||
fr.single = -1;
|
|
||||||
|
|
||||||
outremain = 0x40000 ;
|
get_fileinfo(fname, &fileinfo);
|
||||||
if( !(outbuf=UserAlloc(outremain)))
|
r_bytes=0;
|
||||||
return 0;
|
retval=read_file (fname,testbuff,0,2048,&r_bytes);
|
||||||
|
if ( retval && (r_bytes==0))
|
||||||
touch(outbuf, outremain);
|
|
||||||
|
|
||||||
if ( !(testbuff=UserAlloc(4096)))
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
if (! (inpbuf=UserAlloc(0x10000)))
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
inpbuf = UserAlloc(0x10000);
|
||||||
touch(inpbuf, 0x10000);
|
touch(inpbuf, 0x10000);
|
||||||
|
|
||||||
create_reader(&rd, inpbuf, 0x10000);
|
create_reader(&rd, inpbuf, 0x10000);
|
||||||
|
init_reader(&rd,fname);
|
||||||
|
|
||||||
fname = argv[1];
|
fmt = test_wav((WAVEHEADER*)testbuff);
|
||||||
|
if (fmt != 0)
|
||||||
if(get_fileinfo(fname, &fileinfo)==FILE_NOT_FOUND)
|
|
||||||
{
|
{
|
||||||
_asm
|
snd_play = &play_wave;
|
||||||
{
|
set_reader(&rd, 44);
|
||||||
mov eax, 23
|
outbuf = UserAlloc(32*1024);
|
||||||
mov ebx, 100
|
touch(outbuf, 32768);
|
||||||
int 0x40
|
}
|
||||||
mov [msg], eax
|
else
|
||||||
}
|
{ fmt = test_mp3(testbuff);
|
||||||
if (msg != 7)
|
if(fmt ==0) return 0;
|
||||||
{
|
snd_play = &play_mp3;
|
||||||
debug_out_str("\n\rfile not found\n\r");
|
|
||||||
return 0;
|
outremain = 0x40000 ;
|
||||||
};
|
outbuf = UserAlloc(outremain);
|
||||||
incom = recieve_ipc();
|
touch(outbuf, outremain);
|
||||||
if(incom->code != 'CNCT')
|
make_decode_tables(32767);
|
||||||
{
|
init_layer2();
|
||||||
debug_out_str("\n\rinvalid ipc code\n\r");
|
init_layer3(32);
|
||||||
status = ST_EXIT;
|
fr.single = -1;
|
||||||
return 0;
|
|
||||||
};
|
|
||||||
ipc_client = incom->sender;
|
|
||||||
send_ipc(ipc_client,'CNCT');
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
status = ST_PLAY;
|
||||||
|
|
||||||
|
if (err = CreateBuffer(fmt,0, &hBuff))
|
||||||
|
{
|
||||||
|
debug_out_str("create buffer return error\n\r");
|
||||||
|
; return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
SetVolume(hBuff,l_vol,r_vol);
|
||||||
|
GetVolume(hBuff,&l_vol,&r_vol);
|
||||||
|
|
||||||
snd_init=0;
|
|
||||||
create_thread(thread_proc, 0, 4096);
|
create_thread(thread_proc, 0, 4096);
|
||||||
|
|
||||||
for(snd_init=0,cnt=100; (snd_init==0)&&(cnt!=0); cnt--)
|
|
||||||
delay(10);
|
|
||||||
|
|
||||||
if (!snd_init)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
draw_window();
|
|
||||||
|
|
||||||
while(1)
|
while(1)
|
||||||
|
{ delay(10);
|
||||||
|
switch(status)
|
||||||
|
{ case ST_PLAY:
|
||||||
|
snd_play();
|
||||||
|
continue;
|
||||||
|
|
||||||
|
case ST_STOP:
|
||||||
|
StopBuffer(hBuff);
|
||||||
|
status = ST_DONE;
|
||||||
|
continue;
|
||||||
|
|
||||||
|
case ST_EXIT:
|
||||||
|
StopBuffer(hBuff);
|
||||||
|
DestroyBuffer(hBuff);
|
||||||
|
return 0;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
return 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
void touch(char *buf, int size)
|
||||||
|
{ int i;
|
||||||
|
char a;
|
||||||
|
for ( i = 0;i < size; i+=4096)
|
||||||
|
a = buf[i];
|
||||||
|
};
|
||||||
|
|
||||||
|
DWORD test_mp3(char *buf)
|
||||||
|
{ unsigned long hdr;
|
||||||
|
WAVEHEADER whdr;
|
||||||
|
|
||||||
|
while (1)
|
||||||
|
{ if(rd.filepos > 102400)
|
||||||
|
return 0;
|
||||||
|
if(!rd.head_read(&rd,&hdr))
|
||||||
|
return 0;
|
||||||
|
if(!decode_header(&fr,hdr))
|
||||||
|
{ rd.strpos-=3;
|
||||||
|
rd.stream-=3;
|
||||||
|
rd.strremain+=3;
|
||||||
|
continue;
|
||||||
|
};
|
||||||
|
break;
|
||||||
|
};
|
||||||
|
|
||||||
|
first_sync = rd.filepos-rd.strremain-4;
|
||||||
|
|
||||||
|
whdr.riff_id = 0x46464952;
|
||||||
|
whdr.riff_format = 0x45564157;
|
||||||
|
whdr.wFormatTag = 0x01;
|
||||||
|
whdr.nSamplesPerSec = freqs[fr.sampling_frequency];
|
||||||
|
whdr.nChannels = 2; //mpginfo.channels;
|
||||||
|
whdr.wBitsPerSample = 16;
|
||||||
|
|
||||||
|
return test_wav(&whdr);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
void play_mp3()
|
||||||
|
{ char *outPtr;
|
||||||
|
int totalout;
|
||||||
|
int outcount;
|
||||||
|
|
||||||
|
// memset(&fr,0,sizeof(fr));
|
||||||
|
fr.down_sample_sblimit = 32;
|
||||||
|
fr.single = -1;
|
||||||
|
reset_mpg();
|
||||||
|
|
||||||
|
outPtr = outbuf;
|
||||||
|
totalout=0;
|
||||||
|
done = 0;
|
||||||
|
outremain=0x40000;
|
||||||
|
|
||||||
|
memset(outbuf,0,0x40000);
|
||||||
|
set_reader(&rd, 0); //;first_sync);
|
||||||
|
|
||||||
|
while(1)
|
||||||
|
{ if(status!=ST_PLAY)
|
||||||
|
break;
|
||||||
|
|
||||||
|
for(;;)
|
||||||
|
{ outcount = 0;
|
||||||
|
if( !read_frame(&rd, &fr))
|
||||||
|
{ done = 1;
|
||||||
|
break;
|
||||||
|
};
|
||||||
|
fr.do_layer(&fr, outPtr,&outcount);
|
||||||
|
outPtr+= outcount;
|
||||||
|
totalout+=outcount;
|
||||||
|
outremain-=outcount;
|
||||||
|
if(outremain < outcount*2)
|
||||||
|
break;
|
||||||
|
};
|
||||||
|
|
||||||
|
if(done)
|
||||||
|
{ if(totalout < 4096)
|
||||||
|
{ memset(outPtr,0,4096-totalout);
|
||||||
|
totalout = 4096;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
else
|
||||||
|
if(totalout < 8192)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
outPtr = outbuf;
|
||||||
|
while (totalout >= 4096)
|
||||||
|
{
|
||||||
|
|
||||||
|
WaveOut(hBuff,outPtr,4096);
|
||||||
|
if(status!=ST_PLAY)
|
||||||
|
{ if(status != ST_EXIT)
|
||||||
|
status = ST_STOP;
|
||||||
|
return;
|
||||||
|
};
|
||||||
|
totalout-=4096;
|
||||||
|
outPtr+=4096;
|
||||||
|
outremain+=4096;
|
||||||
|
};
|
||||||
|
if(done)
|
||||||
|
break;
|
||||||
|
|
||||||
|
memmove(outbuf,outPtr, totalout);
|
||||||
|
outPtr = outbuf+totalout;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(status != ST_EXIT)
|
||||||
|
status = ST_STOP;
|
||||||
|
};
|
||||||
|
|
||||||
|
void play_wave()
|
||||||
|
{ int retval;
|
||||||
|
|
||||||
|
set_reader(&rd,44);
|
||||||
|
retval = 0;
|
||||||
|
while(1)
|
||||||
|
{
|
||||||
|
if(status!=ST_PLAY)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if( !stream_read_raw(&rd,outbuf,32768))
|
||||||
|
{ done = 1;
|
||||||
|
break;
|
||||||
|
};
|
||||||
|
WaveOut(hBuff,outbuf,32768);
|
||||||
|
};
|
||||||
|
|
||||||
|
if(status != ST_EXIT)
|
||||||
|
status = ST_STOP;
|
||||||
|
};
|
||||||
|
|
||||||
|
void snd_stop()
|
||||||
|
{
|
||||||
|
StopBuffer(hBuff);
|
||||||
|
};
|
||||||
|
|
||||||
|
void _stdcall thread_proc(void *param)
|
||||||
|
{ int evnt;
|
||||||
|
int pos;
|
||||||
|
int key;
|
||||||
|
DWORD offset;
|
||||||
|
|
||||||
|
_asm
|
||||||
|
{
|
||||||
|
mov eax, 66
|
||||||
|
mov ebx, 1
|
||||||
|
mov ecx, 1
|
||||||
|
int 0x40
|
||||||
|
};
|
||||||
|
|
||||||
|
draw_window();
|
||||||
|
|
||||||
|
while(1)
|
||||||
{ if(status==ST_PLAY)
|
{ if(status==ST_PLAY)
|
||||||
{ draw_progress_bar();
|
{ draw_progress_bar();
|
||||||
evnt = wait_for_event(80);
|
evnt = wait_for_event(80);
|
||||||
@ -285,330 +468,14 @@ int main(int argc, char *argv[]) //int argc, char *argv[])
|
|||||||
draw_progress_bar();
|
draw_progress_bar();
|
||||||
break;
|
break;
|
||||||
};
|
};
|
||||||
break;
|
|
||||||
case EV_IPC:
|
|
||||||
do_ipc();
|
|
||||||
break;
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
void draw_window()
|
|
||||||
{
|
|
||||||
BeginDraw();
|
|
||||||
|
|
||||||
DrawWindow(100,100,299,72,0x404040,3,0,0,0);
|
|
||||||
|
|
||||||
make_button(7,24,45,13, 0x10|BT_NORMAL,0x808080);
|
|
||||||
make_button(56,24,45,13, 0x11|BT_NORMAL,0x808080);
|
|
||||||
make_button(104,24,45,13, 0x12|BT_NORMAL,0x808080);
|
|
||||||
make_button(152,24,45,13, 0x13|BT_NORMAL,0x808080);
|
|
||||||
make_button(200,24,45,13, 0x14|BT_NORMAL,0x808080);
|
|
||||||
make_button(248,24,45,13, 0x15|BT_NORMAL,0x808080);
|
|
||||||
|
|
||||||
make_button(7,41,286,11, 0x30|BT_HIDE|BT_NOFRAME,0x404040);
|
|
||||||
draw_bar(7,41,286,11,0x404040);
|
|
||||||
|
|
||||||
draw_bar(7,55,286,11,0x404040);
|
|
||||||
write_text(12,58,0x004000|FONT0, fname, strlen(fname));
|
|
||||||
write_text(11,57,0x00FF20|FONT0, fname, strlen(fname));
|
|
||||||
|
|
||||||
write_text(8,8,0xFFFFFF|FONT0, header, strlen(header));
|
|
||||||
write_text(12,28,0x404040|FONT0,buttons_text,strlen(buttons_text));
|
|
||||||
write_text(11,27,0xA0FFA0|FONT0,buttons_text,strlen(buttons_text));
|
|
||||||
|
|
||||||
EndDraw();
|
|
||||||
};
|
|
||||||
|
|
||||||
void draw_progress_bar()
|
|
||||||
{ DWORD x;
|
|
||||||
x = 287.0f * (float)(rd.filepos-rd.strremain)/(float)fileinfo.size;
|
|
||||||
if(x==0) return;
|
|
||||||
draw_bar(7,41,x,11,0xA0A0A0);
|
|
||||||
draw_bar(x+7,41,287-x,11,0x404040);
|
|
||||||
};
|
|
||||||
|
|
||||||
void debug_out_str(char* str)
|
|
||||||
{
|
|
||||||
while (*str != 0)
|
|
||||||
{
|
|
||||||
debug_out(*str);
|
|
||||||
str++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void touch(char *buf, int size)
|
|
||||||
{ int i;
|
|
||||||
char a;
|
|
||||||
for ( i = 0;i < size; i+=4096)
|
|
||||||
a = buf[i];
|
|
||||||
};
|
|
||||||
|
|
||||||
DWORD test_mp3(char *buf)
|
|
||||||
{ unsigned long hdr;
|
|
||||||
WAVEHEADER whdr;
|
|
||||||
|
|
||||||
while (1)
|
|
||||||
{ if(rd.filepos > 102400)
|
|
||||||
return 0;
|
|
||||||
if(!rd.head_read(&rd,&hdr))
|
|
||||||
return 0;
|
|
||||||
if(!decode_header(&fr,hdr))
|
|
||||||
{
|
|
||||||
if((hdr & 0xffffff00) == 0x49443300)
|
|
||||||
{
|
|
||||||
int id3length = 0;
|
|
||||||
id3length = parse_new_id3(&rd, hdr);
|
|
||||||
continue;
|
|
||||||
};
|
|
||||||
|
|
||||||
rd.strpos-=3;
|
|
||||||
rd.stream-=3;
|
|
||||||
rd.strremain+=3;
|
|
||||||
continue;
|
|
||||||
};
|
|
||||||
break;
|
|
||||||
};
|
|
||||||
|
|
||||||
first_sync = rd.filepos-rd.strremain-4;
|
|
||||||
|
|
||||||
whdr.riff_id = 0x46464952;
|
|
||||||
whdr.riff_format = 0x45564157;
|
|
||||||
whdr.wFormatTag = 0x01;
|
|
||||||
whdr.nSamplesPerSec = freqs[fr.sampling_frequency];
|
|
||||||
whdr.nChannels = 2; //mpginfo.channels;
|
|
||||||
whdr.wBitsPerSample = 16;
|
|
||||||
|
|
||||||
return test_wav(&whdr);
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
void play_mp3()
|
|
||||||
{ char *outPtr;
|
|
||||||
int totalout;
|
|
||||||
int outcount;
|
|
||||||
|
|
||||||
fr.down_sample_sblimit = 32;
|
|
||||||
fr.single = -1;
|
|
||||||
reset_mpg();
|
|
||||||
|
|
||||||
outPtr = outbuf;
|
|
||||||
totalout=0;
|
|
||||||
done = 0;
|
|
||||||
outremain=0x40000;
|
|
||||||
|
|
||||||
memset(outbuf,0,0x40000);
|
|
||||||
set_reader(&rd, 0); //;first_sync);
|
|
||||||
|
|
||||||
while(1)
|
|
||||||
{ if(status!=ST_PLAY)
|
|
||||||
break;
|
|
||||||
|
|
||||||
for(;;)
|
|
||||||
{ outcount = 0;
|
|
||||||
if( !read_frame(&rd, &fr))
|
|
||||||
{ done = 1;
|
|
||||||
break;
|
|
||||||
};
|
|
||||||
fr.do_layer(&fr, outPtr,&outcount);
|
|
||||||
outPtr+= outcount;
|
|
||||||
totalout+=outcount;
|
|
||||||
outremain-=outcount;
|
|
||||||
if(outremain < outcount*2)
|
|
||||||
break;
|
|
||||||
};
|
|
||||||
|
|
||||||
if(done)
|
|
||||||
{ if(totalout < 4096)
|
|
||||||
{ memset(outPtr,0,4096-totalout);
|
|
||||||
totalout = 4096;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
else if(totalout < 8192) continue;
|
|
||||||
|
|
||||||
outPtr = outbuf;
|
|
||||||
while (totalout >= 4096)
|
|
||||||
{
|
|
||||||
WaveOut(hBuff,outPtr,4096);
|
|
||||||
if(status!=ST_PLAY)
|
|
||||||
{ StopBuffer(hBuff);
|
|
||||||
return;
|
|
||||||
};
|
|
||||||
totalout-=4096;
|
|
||||||
outPtr+=4096;
|
|
||||||
outremain+=4096;
|
|
||||||
};
|
|
||||||
|
|
||||||
if(done)
|
|
||||||
{ status = ST_STOP;
|
|
||||||
|
|
||||||
if( ipc_client)
|
|
||||||
send_ipc(ipc_client,'DONE');
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
memmove(outbuf,outPtr, totalout);
|
|
||||||
outPtr = outbuf+totalout;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
int play_track(char *path)
|
|
||||||
{
|
|
||||||
DWORD fmt;
|
|
||||||
DWORD r_bytes;
|
|
||||||
int retval;
|
|
||||||
int err;
|
|
||||||
// int err;
|
|
||||||
|
|
||||||
retval = ST_DONE;
|
|
||||||
|
|
||||||
get_fileinfo(path, &fileinfo);
|
|
||||||
offset = 0;
|
|
||||||
err=read_file (path,testbuff,0,2048,&r_bytes);
|
|
||||||
if (err)
|
|
||||||
return ST_DONE;
|
|
||||||
|
|
||||||
init_reader(&rd,path);
|
|
||||||
|
|
||||||
fmt = test_wav((WAVEHEADER*)testbuff);
|
|
||||||
if (fmt != 0)
|
|
||||||
{
|
|
||||||
snd_play = &play_wave;
|
|
||||||
set_reader(&rd, 44);
|
|
||||||
retval = ST_PLAY;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{ fmt = test_mp3(testbuff);
|
|
||||||
if(fmt ==0)
|
|
||||||
return ST_DONE;
|
|
||||||
|
|
||||||
snd_play = &play_mp3;
|
|
||||||
outremain = 0x40000;
|
|
||||||
retval = ST_PLAY;
|
|
||||||
};
|
|
||||||
|
|
||||||
SetFormat(hBuff, fmt);
|
|
||||||
return retval;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
void play_wave()
|
|
||||||
{ int retval;
|
|
||||||
|
|
||||||
set_reader(&rd,44);
|
|
||||||
retval = 0;
|
|
||||||
while(1)
|
|
||||||
{
|
|
||||||
if(status!=ST_PLAY)
|
|
||||||
break;
|
|
||||||
|
|
||||||
if( !stream_read_raw(&rd,outbuf,32768))
|
|
||||||
{ done = 1;
|
|
||||||
break;
|
|
||||||
};
|
|
||||||
WaveOut(hBuff,outbuf,32768);
|
|
||||||
};
|
|
||||||
|
|
||||||
if(status != ST_EXIT)
|
|
||||||
status = ST_STOP;
|
|
||||||
};
|
|
||||||
|
|
||||||
void snd_stop()
|
|
||||||
{
|
|
||||||
StopBuffer(hBuff);
|
|
||||||
};
|
|
||||||
|
|
||||||
void do_ipc()
|
|
||||||
{
|
|
||||||
IPC *incom;
|
|
||||||
incom = recieve_ipc();
|
|
||||||
switch(incom->code)
|
|
||||||
{
|
|
||||||
case 'PLAY':
|
|
||||||
fname = incom->data;
|
|
||||||
status = ST_TRACK;
|
|
||||||
return;
|
|
||||||
|
|
||||||
case 'STOP':
|
|
||||||
status = ST_STOP;
|
|
||||||
return;
|
|
||||||
|
|
||||||
case 'EXIT':
|
|
||||||
status = ST_EXIT;
|
|
||||||
exit();
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
void _stdcall thread_proc(void *param)
|
|
||||||
{
|
|
||||||
int err;
|
|
||||||
|
|
||||||
if (err = CreateBuffer(PCM_ALL|PCM_OUT,0, &hBuff))
|
|
||||||
{
|
|
||||||
debug_out_str("create buffer return error\n\r");
|
|
||||||
exit();
|
|
||||||
};
|
|
||||||
|
|
||||||
SetVolume(hBuff,l_vol,r_vol);
|
|
||||||
GetVolume(hBuff,&l_vol,&r_vol);
|
|
||||||
// debug_out_hex(l_vol);
|
|
||||||
// debug_out_str("\n\r");
|
|
||||||
// debug_out_hex(r_vol);
|
|
||||||
// debug_out_str("\n\r");
|
|
||||||
|
|
||||||
if(fname[0] !='/0')
|
|
||||||
status = play_track(fname);
|
|
||||||
|
|
||||||
debug_out_str("\n\rPlay file ");
|
|
||||||
debug_out_str(fname);
|
|
||||||
debug_out_str("\n\r");
|
|
||||||
|
|
||||||
snd_init = 1;
|
|
||||||
|
|
||||||
while(1)
|
|
||||||
{ delay(10);
|
|
||||||
switch(status)
|
|
||||||
{
|
|
||||||
case ST_TRACK:
|
|
||||||
strcpy(path, fname);
|
|
||||||
status = play_track(fname);
|
|
||||||
if( ipc_client & (status == ST_DONE))
|
|
||||||
{ send_ipc(ipc_client,'DONE');
|
|
||||||
continue;
|
|
||||||
};
|
|
||||||
|
|
||||||
case ST_PLAY:
|
|
||||||
snd_play();
|
|
||||||
continue;
|
|
||||||
|
|
||||||
case ST_STOP:
|
|
||||||
StopBuffer(hBuff);
|
|
||||||
status = ST_DONE;
|
|
||||||
continue;
|
|
||||||
|
|
||||||
case ST_EXIT:
|
|
||||||
StopBuffer(hBuff);
|
|
||||||
DestroyBuffer(hBuff);
|
|
||||||
if (ipc_client)
|
|
||||||
send_ipc(ipc_client,'EXIT');
|
|
||||||
return;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
void delay (int val)
|
void delay (int val)
|
||||||
{
|
{
|
||||||
_asm
|
_asm
|
||||||
{ mov eax,5
|
{ mov eax,5
|
||||||
mov ebx, [val]
|
mov ebx, [val]
|
||||||
int 0x40
|
int 0x40
|
||||||
};
|
};
|
||||||
|
@ -19,10 +19,6 @@ public _write_text@20
|
|||||||
public _debug_out@4
|
public _debug_out@4
|
||||||
public _debug_out_hex@4
|
public _debug_out_hex@4
|
||||||
public _create_thread@12
|
public _create_thread@12
|
||||||
public _init_ipc@0
|
|
||||||
public _recieve_ipc@0
|
|
||||||
public _send_ipc@8
|
|
||||||
|
|
||||||
|
|
||||||
public _memset
|
public _memset
|
||||||
|
|
||||||
@ -397,95 +393,6 @@ toend:
|
|||||||
|
|
||||||
ret
|
ret
|
||||||
|
|
||||||
public _allmul
|
|
||||||
|
|
||||||
_allmul:
|
|
||||||
mov eax, [esp+8]
|
|
||||||
mov ecx, [esp+16]
|
|
||||||
or ecx,eax
|
|
||||||
mov ecx, [esp+12]
|
|
||||||
jnz .hard
|
|
||||||
mov eax, [esp+4]
|
|
||||||
mul ecx
|
|
||||||
ret 16
|
|
||||||
.hard:
|
|
||||||
push ebx
|
|
||||||
mul ecx
|
|
||||||
mov ebx,eax
|
|
||||||
mov eax, [esp+8]
|
|
||||||
mul dword [esp+20]
|
|
||||||
add ebx,eax
|
|
||||||
mov eax,[esp+8]
|
|
||||||
mul ecx
|
|
||||||
add edx,ebx
|
|
||||||
pop ebx
|
|
||||||
ret 16
|
|
||||||
|
|
||||||
align 4
|
|
||||||
_allshr:
|
|
||||||
cmp cl,64
|
|
||||||
jae .sign
|
|
||||||
|
|
||||||
cmp cl, 32
|
|
||||||
jae .MORE32
|
|
||||||
shrd eax,edx,cl
|
|
||||||
sar edx,cl
|
|
||||||
ret
|
|
||||||
.MORE32:
|
|
||||||
mov eax,edx
|
|
||||||
sar edx,31
|
|
||||||
and cl,31
|
|
||||||
sar eax,cl
|
|
||||||
ret
|
|
||||||
.sign:
|
|
||||||
sar edx,31
|
|
||||||
mov eax,edx
|
|
||||||
ret
|
|
||||||
|
|
||||||
public __ftol2_sse
|
|
||||||
|
|
||||||
align 4
|
|
||||||
__ftol2_sse:
|
|
||||||
push ebp
|
|
||||||
mov ebp, esp
|
|
||||||
sub esp, 20
|
|
||||||
and esp, 0xFFFFFFF0
|
|
||||||
fld st0
|
|
||||||
fst dword [esp+18]
|
|
||||||
fistp qword [esp+10]
|
|
||||||
fild qword [esp+10]
|
|
||||||
mov edx, [esp+18]
|
|
||||||
mov eax, [esp+10]
|
|
||||||
test eax, eax
|
|
||||||
jz .QnaNZ
|
|
||||||
|
|
||||||
.not_QnaNZ:
|
|
||||||
fsubp st1, st0
|
|
||||||
test edx, edx
|
|
||||||
jns .pos
|
|
||||||
fstp dword [esp]
|
|
||||||
mov ecx, [esp]
|
|
||||||
xor ecx, 0x80000000
|
|
||||||
add ecx, 0x7FFFFFFF
|
|
||||||
adc eax, 0
|
|
||||||
mov edx, [esp+14]
|
|
||||||
adc edx, 0
|
|
||||||
jmp .exit
|
|
||||||
.pos:
|
|
||||||
fstp dword [esp]
|
|
||||||
mov ecx, [esp]
|
|
||||||
add ecx, 0x7FFFFFFF
|
|
||||||
sbb eax, 0
|
|
||||||
jmp .exit
|
|
||||||
.QnaNZ:
|
|
||||||
mov edx, [esp+14]
|
|
||||||
test edx, 0x7FFFFFFF
|
|
||||||
jne .not_QnaNZ
|
|
||||||
fstp dword [esp+18]
|
|
||||||
fstp dword [esp+18]
|
|
||||||
.exit:
|
|
||||||
leave
|
|
||||||
ret
|
|
||||||
|
|
||||||
public __fltused
|
public __fltused
|
||||||
__fltused dd 0
|
__fltused dd 0
|
||||||
@ -497,49 +404,5 @@ align 4
|
|||||||
fileio FILEIO
|
fileio FILEIO
|
||||||
|
|
||||||
|
|
||||||
align 4
|
|
||||||
_init_ipc@0:
|
|
||||||
push ebx
|
|
||||||
mov eax, 60
|
|
||||||
mov ebx, 1
|
|
||||||
mov ecx, ipc_buff
|
|
||||||
mov edx, (5*4+1024)
|
|
||||||
int 0x40
|
|
||||||
pop ebx
|
|
||||||
ret
|
|
||||||
|
|
||||||
align 4
|
|
||||||
_recieve_ipc@0:
|
|
||||||
mov [ipc_buff.size], 8
|
|
||||||
mov eax, ipc_buff.sender
|
|
||||||
ret
|
|
||||||
align 4
|
|
||||||
proc _send_ipc@8 stdcall, dst:dword, code:dword
|
|
||||||
push ebx
|
|
||||||
push esi
|
|
||||||
|
|
||||||
mov eax, 60
|
|
||||||
mov ebx, 2
|
|
||||||
mov ecx, [dst]
|
|
||||||
lea edx, [code]
|
|
||||||
mov esi, 4
|
|
||||||
int 0x40
|
|
||||||
pop esi
|
|
||||||
pop ebx
|
|
||||||
ret
|
|
||||||
endp
|
|
||||||
|
|
||||||
;align 4
|
|
||||||
;ipc_ctrl:
|
|
||||||
; .pid dd ?
|
|
||||||
; .size dd 4
|
|
||||||
; .msg dd ?
|
|
||||||
|
|
||||||
align 4
|
|
||||||
ipc_buff:
|
|
||||||
.lock dd 0
|
|
||||||
.size dd 8
|
|
||||||
.sender dd ?
|
|
||||||
.msg_size dd ?
|
|
||||||
.msg dd ?
|
|
||||||
.data rb 1024
|
|
Loading…
Reference in New Issue
Block a user