?? 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;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -