?? sound.c
字號:
#include <stdio.h>
#include <conio.h>
#include <dos.h>
#include <string.h>
#include <bios.h>
#include <mem.h>
#include <graphics.h>
#include <stdlib.h>
#include <io.h>
#include <fcntl.h>
#include <math.h>
#include <dir.h>
#include "isp1362.h"
#include "isa290.h"
#include "reg.h"
#include "cheeyu.h"
#include <fcntl.h>
#include <io.h>
unsigned int audio_addr=1;
unsigned int MasterToggle=5;
char filename[MAXPATH]="\\you.wav";
long file_mod(char mode, unsigned int *sptr)
{
static FILE *stream;
static factor=6;
unsigned int toggle=MasterToggle;
static signed int sbuf[2048];
static signed int tbuf[2048];
signed int cnt;
signed int t_cnt;
int handle;
unsigned long songlength;
unsigned long len_in_kb;
unsigned long accu_L=0;
unsigned long accu_R=0;
static unsigned int avg_L;
static unsigned int avg_R;
struct ffblk ffblk;
int done;
int dir_cnt=0;
char cur_dir[MAXDIR];
if(mode=='N') //New OPEN
{
e_box(320,200,580,320);
//Look for default file first...
if( (stream = fopen(filename,"rb"))!=NULL ) //default file found!
{
gotoxy(12,5);
printf("Default wav file found!");
fclose(stream);
}
else //File not found... get filename from user
{
gotoxy(12,5);
getcwd(cur_dir,MAXPATH);
printf("Default wav file not found!");
gotoxy(12,6);
printf("Searching for wave files in %s ",cur_dir);
done = findfirst("*.wav",&ffblk,0);
while ((!done)&&(dir_cnt<10))
{
gotoxy(12,7+dir_cnt);
printf("File : %s\n", ffblk.ff_name);
done = findnext(&ffblk);
dir_cnt++;
}
gotoxy(12,16);
printf("Full path of file name to play: ");
scanf("%s",filename);
if( (stream = fopen(filename,"rb"))!=NULL ) //user file found!
{
gotoxy(12,17);
printf("User input file found!");
fclose(stream);
}
else
{
gotoxy(12,17);
printf("User input file NOT found! Exiting...");
getch();
exit(0);
}
}
//================
handle = open(filename, O_RDONLY);
songlength=filelength(handle);
close(handle);
len_in_kb=songlength/1024;
stream = fopen(filename,"rb");
do
{
sbuf[cnt]=getw(stream);
cnt++;
}
while(cnt<20);
}
if(mode=='O') //OPEN
{
handle = open(filename, O_RDONLY);
songlength=filelength(handle);
close(handle);
len_in_kb=songlength/1024;
if( (stream = fopen(filename,"rb"))==NULL )
{
printf("\nFile open failed!!\n");
exit(0);
}
else
{
printf("\nFile Found and Opened! File Length is %ld Bytes (%ld KBytes)",songlength,len_in_kb);
printf("\n");
do
{
sbuf[cnt]=getw(stream);
cnt++;
}
while(cnt<20);
}
}
if(mode=='C') //CLOSE
{
fclose(stream);
}
if(mode=='V') //Left Vol
{
return(avg_L);
}
if(mode=='U') //Right Vol
{
return(avg_R);
}
if(mode=='F') //CLOSE
{ return(len_in_kb); }
if(mode=='L') //CLOSE
{ if(factor>= 0) {factor--;} }
if(mode=='S') //CLOSE
{ if(factor<=15) {factor++;} }
if(mode=='R') //READ
{
cnt=0;
do
{
sbuf[cnt]=getw(stream);
accu_L=accu_L+(abs)(sbuf[cnt]);
cnt++;
}
while(cnt<(88*toggle));
avg_L=accu_L/(88*toggle);
accu_L=0;
cnt=0;
do
{
tbuf[cnt]=getw(stream);
accu_R=accu_R+(abs)(tbuf[cnt]);
cnt++;
}
while(cnt<(88*toggle));
avg_R=accu_R/(88*toggle);
accu_R=0;
}
/*
if(mode=='R') //READ
{
cnt=0;
do
{
sbuf[cnt]=getw(stream);
accu_L=accu_L+(abs)(sbuf[cnt]);
cnt++;
}
while(cnt<(88*toggle));
avg_L=accu_L/(88*toggle);
cnt=0;
do
{
tbuf[cnt]=getw(stream);
accu_R=accu_R+(abs)(tbuf[cnt]);
cnt++;
}
while(cnt<(88*toggle));
avg_R=accu_R/(88*toggle);
accu_R=0;
accu_L=0;
}
*/
if(mode=='G') //GET
{
t_cnt=0;
do
{
cnt=0;
do
{
*(sptr+(92*t_cnt)+cnt+4)=(sbuf[cnt+(88*t_cnt)])>>factor;
cnt++;
}
while(cnt<88);
t_cnt++;
}
while(t_cnt<toggle);
}
if(mode=='H') //GET BUF2
{
t_cnt=0;
do
{
cnt=0;
do
{
*(sptr+(92*t_cnt)+cnt+4)=(tbuf[cnt+(88*t_cnt)])>>factor;
cnt++;
}
while(cnt<88);
t_cnt++;
}
while(t_cnt<toggle);
}
}
void prepare_sound_dma(unsigned int ptl,unsigned int start,unsigned int ptl_len,unsigned int TR,unsigned int byte_size)
{
signed int cbuf[2048];
unsigned int blk_size;
unsigned int cnt=0;
if(ptl==0) {file_mod('G',cbuf);}
if(ptl==1) {file_mod('H',cbuf);}
blk_size=((byte_size+3)/4)*4;
cnt=0;
do
{
if(cnt!=(TR-1))
{
iso_ptd(cbuf+(cnt*92),OUT,0,4,byte_size,0,2,start+cnt+(TR*ptl));
}
if(cnt==(TR-1))
{
iso_ptd(cbuf+(cnt*92),OUT,1,4,byte_size,0,2,start+cnt+(TR*ptl));
}
cnt++;
}
while(cnt<TR);
w16(HcUpInt,0xFFFF);
// send_iso_dma(cbuf,460,ptl);
// send_iso_dma(cbuf,TR*184,ptl);
do
{
}
while( ((r16(HcUpInt))&0x08)==0);
if(ptl==1)
{
file_mod('R',0);
}
}
void prepare_sound(unsigned int ptl,unsigned int start,unsigned int ptl_len,unsigned int TR,unsigned int byte_size)
{
signed int cbuf[2048];
unsigned int blk_size;
unsigned int cnt=0;
if(ptl==0) {file_mod('G',cbuf);}
if(ptl==1) {file_mod('H',cbuf);}
blk_size=((byte_size+3)/4)*4;
cnt=0;
do
{
if(cnt!=(TR-1))
{
iso_ptd(cbuf+(cnt*92),OUT,0,4,byte_size,0,audio_addr,start+cnt+(TR*ptl));
}
if(cnt==(TR-1))
{
iso_ptd(cbuf+(cnt*92),OUT,1,4,byte_size,0,audio_addr,start+cnt+(TR*ptl));
}
cnt++;
}
while(cnt<TR);
send_iso(cbuf,TR*184,0,(ptl_len*ptl));
if(ptl==1)
{
file_mod('R',0);
}
}
void v_bar(int VL, int VR, int it_y)
{
static int lin_L,lin_R;
static int p_L=0,p_R=0;
int cnt=0;
int temp;
static int max_R=0,max_L=0;
if((VR!=0)&&(VL!=0))
{
lin_L=(80*(logl(VL)-1))-350;
lin_R=(80*(logl(VR)-1))-350;
}
if(lin_L<0) {lin_L=0;}
if(lin_R<0) {lin_R=0;}
if(lin_L>400) {lin_L=400;}
if(lin_R>400) {lin_R=400;}
if(lin_L>max_L) {max_L=lin_L;}
if(lin_R>max_R) {max_R=lin_R;}
if(p_L<lin_L)
{
setfillstyle(SOLID_FILL,YELLOW);
bar(20 ,450-p_L, 35,450-lin_L);
}
else
{
setfillstyle(SOLID_FILL,BLUE);
bar(20 ,450-p_L, 35,450-lin_L);
}
if(p_R<lin_R)
{
setfillstyle(SOLID_FILL,YELLOW);
bar(605,450-p_R,620,450-lin_R);
}
else
{
setfillstyle(SOLID_FILL,BLUE);
bar(605,450-p_R,620,450-lin_R);
}
p_L=lin_L;
p_R=lin_R;
}
void v_ind(int VL, int VR, int it_y)
{
static int lin_L,lin_R;
static int p_L=0,p_R=0;
int cnt=0;
int temp;
static int max_R=0,max_L=0;
if((VR!=0)&&(VL!=0))
{
lin_L=(80*(logl(VL)-1))-350;
lin_R=(80*(logl(VR)-1))-350;
}
if(lin_L<0) {lin_L=0;}
if(lin_R<0) {lin_R=0;}
if(lin_L>400) {lin_L=400;}
if(lin_R>400) {lin_R=400;}
if(lin_L>max_L) {max_L=lin_L;}
if(lin_R>max_R) {max_R=lin_R;}
p_L=lin_L;
p_R=lin_R;
}
void send_sound_gui(int mode)
{
unsigned long lbuf;
unsigned long fm;
unsigned long status1;
unsigned int start=6;
unsigned int init_wait=500;
unsigned int user_in;
unsigned int TR=MasterToggle;
unsigned int t_size=176;
unsigned int Up_Int,b_status;
unsigned int c_fm;
unsigned int d_cnt=0;
struct time ti;
struct time tf;
unsigned long f_fm;
unsigned int ma_ptl_size;
unsigned int tcnt;
unsigned long l_cnt;
unsigned long ending;
unsigned long end_cnt;
signed int target_f,current_f;
signed int volume=10;
signed int LV,RV;
clrscr();
cleardevice();
w16(HcBufStatus,0x0000);
file_mod('N',0);
file_mod('R',0);
ending=file_mod('F',0);
ma_ptl_size=r16(HcPTLLen);
clrscr();
cleardevice();
e_box(320,160,620,300);
advlogo();
gotoxy(23,3);
printf("Philips USB WavPlayer For ISP1362");
gotoxy(23,4);
printf("=================================");
gotoxy(13,5);
printf("Wave File Size=%ld KBytes, Play Time = %2.1f Minutes",ending,((float)ending*1024)/(44100*60*4) );
end_cnt=(ending*1024)/(176*TR)-100;
delay(200);
//ISO Buffer Setting
w16(HcPTLLen ,ma_ptl_size);
w16(HcPTLTogRate , TR);
w16(HcUpInt , 0xFFFF);
w32(HcIntEnable , 0x000000FF);
set_operational();
enable_port();
status1=r32(HcRhP2);
e_box(135,150,180,100);
gotoxy(9,8);
printf("L :increase volume");
gotoxy(9,9);
printf("S :decrease volume");
gotoxy(9,10);
printf("X :stop playing");
gotoxy(9,11);
printf("Current Vol: %2d",volume);
fm=r32(HcFmNo);
start=start+init_wait+(unsigned int)(fm&0xFFFF);
file_mod('R',0);
prepare_sound(0,start,ma_ptl_size,TR,t_size);
prepare_sound(1,start,ma_ptl_size,TR,t_size);
e_box(415,150,360,100);
gotoxy(33,8);
printf("Initial frame number is %6lX",fm);
gotoxy(33,9);
printf("Waiting for frame number %6X",start);
do
{
fm=r32(HcFmNo);
gotoxy(33,10);
printf("Current Frame Number : %8lX",fm);
}
while((unsigned int)(fm&0xFFFF)!=(start-1));
gotoxy(33,10);
printf("Kick Start ISO Engine... ");
gettime(&ti);
w16(HcBufStatus,0x0003);
tcnt=2;
l_cnt=2;
do
{
user_in=read_key(0);
if(user_in=='L') {if(volume<15) {file_mod('L',0); volume++;} }
if(user_in=='S') {if(volume>0 ) {file_mod('S',0); volume--;} }
gotoxy(9,11);
printf("Current Vol: %2d ",volume);
gotoxy(9,12);
printf("Progress : %2d%",(l_cnt*100)/end_cnt);
if(user_in=='X') {l_cnt=1000000; }
LV=file_mod('V',0);
RV=file_mod('U',0);
if((l_cnt%10)==0) {v_ind(LV,RV,240);}
//wait for PTL0 to be done....
do
{
fm=r32(HcFmNo);
current_f=(unsigned int)(fm&0xFFFF);
target_f =(start+(tcnt*TR)-TR);
gotoxy(33,11);
printf("Preparing ISO group %08ld @<%08lX>",l_cnt,fm);
if((current_f-target_f)>100)
{break;}
if((target_f-current_f)>100)
{break;}
}
while(current_f<target_f);
//refill PTL0
if(mode=='D')
{
prepare_sound_dma(0,start+(tcnt*TR),ma_ptl_size,TR,t_size);
}
if(mode=='P')
{
prepare_sound(0,start+(tcnt*TR),ma_ptl_size,TR,t_size);
}
w16(HcUpInt,0x0002);
b_status=r16(HcBufStatus);
w16(HcBufStatus,0x0001|b_status);
//wait for PTL1 to be done....
do
{
fm=r32(HcFmNo);
current_f=(unsigned int)(fm&0xFFFF);
target_f =(start+(tcnt*TR));
gotoxy(33,11);
printf("Preparing ISO group %08ld @<%08lX>",l_cnt,fm);
if((current_f-target_f)>100)
{break;}
if((target_f-current_f)>100)
{break;}
}
while(current_f<target_f);
//refill PTL1
if(mode=='D')
{
prepare_sound_dma(1,start+(tcnt*TR),ma_ptl_size,TR,t_size);
}
if(mode=='P')
{
prepare_sound(1,start+(tcnt*TR),ma_ptl_size,TR,t_size);
}
w16(HcUpInt,0x0004);
b_status=r16(HcBufStatus);
w16(HcBufStatus,0x0002|b_status);
tcnt=tcnt+2;
l_cnt=l_cnt+2;
}
while(l_cnt<end_cnt);
w16(HcDMACfg,0x0000); //to terminate DMA altogether
w16(HcBufStatus,0x0000);
f_fm=fm;
gettime(&tf);
gotoxy(20,14);
printf("WavPlayer Started at %02d:%02d:%02d.%02d",ti.ti_hour,ti.ti_min,ti.ti_sec,ti.ti_hund);
gotoxy(20,15);
printf("WavPlayer Stopped at %02d:%02d:%02d.%02d",tf.ti_hour,tf.ti_min,tf.ti_sec,tf.ti_hund);
gotoxy(20,16);
printf("Final Frame Number is %8lX",f_fm);
gotoxy(20,17);
printf("Press 1 to Exit");
file_mod('C',0);
getch();
}
void usb_audio_gui(int mode)
{
unsigned int user_in;
unsigned int cbuf[128];
unsigned int rbuf[128];
unsigned int dev_req[4]={0x0680,0x0100,0x0000,0x0008};
unsigned int uni_req[4]={0x0500,3,0x0000,0x0000};
unsigned char udn[64];
//buffer information
unsigned int atllen,ptllen,intllen;
unsigned int atl_start;
//atl parameters
unsigned long atl_skip=0xFFFFFFFE;
unsigned long atl_done=0;
unsigned long atl_last=0x00000001;
unsigned int atl_blk_size=64;
unsigned int atl_cnt=1;
unsigned int atl_timeout=200;
unsigned int mycode;
unsigned int cnt,name_length;
unsigned int iManufacturer,iProduct;
unsigned long rhp1,rhp2;
unsigned int starty=5;
unsigned int status;
unsigned int mouse01=0,mouse02=0;
clrscr();
set_operational();
enable_port();
delay(300);
reset_usb();
erase_all();
set_operational();
enable_port();
delay(300);
w16(HcBufStatus,0x00);
//Setup ATL Parameters
w32(HcATLSkip,atl_skip);
w32(HcATLLast,atl_last);
w16(HcATLBlkSize,atl_blk_size);
w16(HcATLThrsCnt,atl_cnt);
w16(HcATLTimeOut,atl_timeout);
//Setup ATL Buffer
atllen =r16(HcATLLen);
ptllen =r16(HcPTLLen);
intllen =r16(HcINTLen);
atl_start=ptllen+ptllen+intllen;
status=assign_address(1,2,0);
gotoxy(1,1);
printf("ISP1362 Audio Demo");
gotoxy(1,2);
printf("Probing USB downstream ports... ");
if(status==0x0100) {printf("Connection detected at port 1.");}
else if(status==0x0001) {printf("Connection detected at port 2.");}
else if(status==0x0101) {printf("Connection detected at port 1 and 2.");}
else
{
printf("No connection detected. %4X",status);
getchar();
return 0;
}
w16(HcUpIntEnable,0x100);
if( (status&0x0100)!=0) //port 1 active
{
//Check port 1 for mouse
printf("\nGetting device descriptor for device at port 1... ");
mycode=get_control(rbuf,1,'D',0,1);
printf("%04X",mycode);
if(mycode==0x0300)
{
iManufacturer = rbuf[7]&0xFF;
iProduct = (rbuf[7]&0xFF00)>>8;
addr_info(1,'W','O',iManufacturer);
addr_info(1,'W','P',iProduct);
mycode=get_control(rbuf,1,'H',addr_info(1,'R','P',0),1);
{
mycode=set_config(1,1);
printf("\nSetting config of device 1 to config 2... %04X",mycode);
set_interface(1,0,1);
set_sound(1,1,0x0121,0x0300,0x0200,0x0001,0x0000);
set_sound(1,1,0x0121,0x0500,0x0200,0x0001,0x0000);
set_sound(1,1,0x0121,0x0201,0x0200,0x0002,0xF400);
set_sound(1,1,0x0121,0x0202,0x0200,0x0002,0xF400);
set_interface(1,0,1);
set_interface(1,4,1);
set_sound(1,1,0x0121,0x0201,0x0200,0x0002,0xF416);
set_sound(1,1,0x0121,0x0202,0x0200,0x0002,0xF416);
audio_addr=1;
}
}
}
if( (status&0x0001)!=0) //port 2 active
{
//Check port 2 for mouse
mycode=get_control(rbuf,2,'D',0,2);
printf("\nGetting device descriptor for device at port 2... ");
printf("%04X",mycode);
if(mycode==0x0300)
{
iManufacturer = rbuf[7]&0xFF;
iProduct = (rbuf[7]&0xFF00)>>8;
addr_info(2,'W','O',iManufacturer);
addr_info(2,'W','P',iProduct);
mycode=get_control(rbuf,2,'H',addr_info(2,'R','P',0),2);
{
mycode=set_config(2,1);
printf("\nSetting config of device 2 to config 2... %04X",mycode);
set_interface(2,0,2);
set_sound(2,2,0x0121,0x0300,0x0200,0x0001,0x0000);
set_sound(2,2,0x0121,0x0500,0x0200,0x0001,0x0000);
set_sound(2,2,0x0121,0x0201,0x0200,0x0002,0xF400);
set_sound(2,2,0x0121,0x0202,0x0200,0x0002,0xF400);
set_interface(2,0,2);
set_interface(2,4,2);
set_sound(2,2,0x0121,0x0201,0x0200,0x0002,0xF416);
set_sound(2,2,0x0121,0x0202,0x0200,0x0002,0xF416);
audio_addr=2;
}
}
}
getch();
gui();
send_sound_gui(mode);
close_gui();
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -