www.pudn.com > MiniOS.rar > ex10.c


// 
// example 10: This example Plays original sound on OS, explain how to Play sound on OS. 
// author: Taiyun Wang  
// date:2003/2/22 
/////////////////////////////////////////////////////////////////////////// 
#include "sposvar.h" 
#include "spos.h" 
 
#define BUFLEN 60 
#define BUFSIZE 2 
 
extern long RES_ORIG2_RAW_SA; 
extern long RES_ORIG2_RAW_EA; 
 
 
unsigned int* pStart; 
unsigned int* pEnd; 
int SegStart; 
int SegEnd; 
int playpointer = 0;			 
int playbuf = 0; 
 
int buff[BUFSIZE][BUFLEN];		//sound buffer 
 
int err;						//Error No 
int t1stack[32];				//Task 1 stack 
int t2stack[20];				//Task 2 stack 
HEvent sem;						//Event handle 
 
volatile unsigned int *P_IOB_BUFFER =(unsigned int*)(0x7006);	//Port B data register 
volatile unsigned int *P_IOB_DIR =(unsigned int*)(0x7007);		//Port B direction register 
volatile unsigned int *P_IOB_ATTRIB = (unsigned int*)(0x7008);	//Port B attribute register 
 
 
volatile unsigned int* P_DAC_Ctrl = (unsigned int*) 0x7015;		//DAC control register 
volatile unsigned int* P_DAC1 = (unsigned int*) 0x7017;			//DAC1 data register 
volatile unsigned int* P_DAC2 = (unsigned int*) 0x7016;			//DAC2 data register 
 
void int_func(void);			//interrupt function 
 
main() 
{ 
	void Task1(); 
	void Task2(); 
	void DACInit(); 
	SpSInit(); 
	*P_IOB_DIR = 0XFFFF;									//Set Port B direction 
	*P_IOB_ATTRIB = 0XFFFF;									//Set Port B attribute  
	DACInit(); 
	*P_DAC1 = 0x0; 
	*P_DAC2 = 0x0; 
	 
	err = SpSTaskCreate(Task1,(void*)0,t1stack+31,1);		//Create first task 
	err = SpSTaskCreate(Task2,(void*)0,t2stack+19,2);		//Create second task 
	sem = SpSSemCreate(0); 
	SpSStart();												//Start OS kernel 
} 
void DACInit() 
{ 
	pStart =    (unsigned int *)(int)RES_ORIG2_RAW_SA;		//Start pointer 
	pEnd =      (unsigned int *)(int)RES_ORIG2_RAW_EA;		//End pointer 
	SegStart =  (unsigned int)(RES_ORIG2_RAW_SA>>6)&0xFC00;	//Start segment 
	SegEnd =    (unsigned int)(RES_ORIG2_RAW_EA>>6)&0xFC00;	//End segment 
	SpFSetTimer(OS_SET_TIMEA,0x0030,0xFA23); 
} 
void Task1() 
{ 
	int fillbuf(int buffno); 
	int ret; 
	fillbuf(0); 
	fillbuf(1); 
	SpSSetVector(FIQ_TMA_VEC,int_func); 
	SpFAddINTVec(FIQ_TMA_EN); 
	while(1) { 
		SpSSemPend(sem,0); 
		ret = fillbuf(((unsigned int)(playbuf-1)%BUFSIZE)); 
		if(ret) { 
			SpSTimeDly(1); 
			SpFDelINTVec(FIQ_TMA_EN); 
			*P_DAC1 = 0x78f0; 
			*P_DAC2 = 0x78f0; 
			SpSTaskExit(); 
		} 
	} 
} 
void Task2() 
{ 
	unsigned int i = 1; 
    while(1) { 
		*P_IOB_BUFFER = i; 
		i<<=1; 
		if(i == 0x0100) 
			i = 1; 
		SpSTimeDly(20); 
	} 
	 
} 
void int_func(void) 
{ 
	 
	*P_DAC1 = (unsigned char)buff[playbuf][playpointer]; 
	*P_DAC2 = (unsigned char)buff[playbuf][playpointer++]; 
	if(playpointer == BUFLEN) { 
		playbuf = (unsigned int)(playbuf+1)%BUFSIZE; 
		playpointer = 0; 
		SpSSemPost(sem); 
	} 
} 
int fillbuf(int buffno) 
{ 
	int i; 
	unsigned int tmp; 
	__asm__("INT OFF \n\t"								//Set data segment 
			"SR = SR AND 0x03FF \n\t" 
			"SR = SR OR %0" 
			: 
			:"m"(SegStart) 
			); 
	SpSEnableINT();										//Enable interrupt 
	for(i = 0;i <= BUFLEN;i++) { 
		__asm__("%0 = D:[%1] \n\t"						//Read sound data to tmp 
				:"=r"(tmp) 
				:"r"(pStart) 
				); 
		pStart++; 
		buff[buffno][i] = tmp; 
		if((pStart >= pEnd)&&(SegStart == SegEnd))		//Play finished 
			return 1; 
		if(pStart == (void*)0) { 
			SegStart+=0x0400; 
			__asm__("INT OFF \n\t"						//Set data segment 
					"SR = SR AND 0x03FF \n\t" 
					"SR = SR OR %0" 
					: 
					:"m"(SegStart) 
					); 
			SpSEnableINT(); 
		} 
	} 
	return 0; 
}