📄 playmgr.c
字号:
//*****************************************************************
//
// File Name : 'playmgr.c'
// Title : buffered mp3 play manager
// Author : Pascal Stang
// Date : 11/22/2000
// Version : 0.1
// Target MCU : ATmega103
// Editor Tabs : 3
//
//*****************************************************************
#ifndef WIN32
#include <io.h>
#include <signal.h>
#include <interrupt.h>
#endif
#include "global.h"
#include "systimer.h"
#include "spi.h"
#include "sta013.h"
#include "playmgr.h"
// global variables
//cBuffer PlayBuffer;
//volatile u08 PlayMode;
//#define PLAYMGR_MODE_STOP 0x00;
//#define PLAYMGR_MODE_PLAY 0x01;
SIGNAL(SIG_SPI)
{
// if we're in play mode
// if(PlayMode == PLAYMGR_MODE_PLAY)
// if(PlayMode && (PlayBuffer.datalength!=0))
// if the mp3 decoder wants data
// if(sta013Demand())
if(bit_is_set(STA013_DEMAND_PORTIN,STA013_DEMAND_PIN))
{
// send next byte over SPI
outp(PlayBuffer.dataptr[PlayBuffer.dataindex++], SPDR);
// decrement the data length
PlayBuffer.datalength--;
// do buffer looping at size
//PlayBuffer.dataindex &= (PlayBuffer.size-1);
if(PlayBuffer.dataindex == PlayBuffer.size)
PlayBuffer.dataindex = 0;
}
}
// make sure this interrupt is set up for edge triggerring
SIGNAL(STA013_DEMAND_INTR)
{
// the mp3 decoder wants data!
// are we in play mode
// if(PlayMode && (PlayBuffer.datalength!=0))
if(PlayMode)
{
// send next byte over SPI
outp(PlayBuffer.dataptr[PlayBuffer.dataindex++], SPDR);
// decrement the data length
PlayBuffer.datalength--;
// do buffer looping at size
//PlayBuffer.dataindex &= (PlayBuffer.size-1);
if(PlayBuffer.dataindex == PlayBuffer.size)
PlayBuffer.dataindex = 0;
}
}
void playmgrInit(void)
{
// set up data buffers
playmgrBuffer(MP3PLAY_BUFFER_ADDR, MP3PLAY_BUFFER_SIZE);
// set up demand interrupt for edge triggering
// for ISCX1,ISCX0
// 0,0 - int on low level
// 0,1 - reserved
// 1,0 - int on falling edge
// 1,1 - int on rising edge
sbi(EICR, ISC41);
sbi(EICR, ISC40);
// enable demand interrupt
sbi(EIMSK, INT4);
// enable SPI interrupt
sbi(SPCR, SPIE);
}
void playmgrBuffer(u16 Buffer, u16 bufferSize)
{
// set data pointer
PlayBuffer.dataptr = (unsigned char*)Buffer;
// set buffer size
PlayBuffer.size = bufferSize;
// set play buffer datalength to zero
PlayBuffer.datalength = 0;
// set play buffer index to zero
PlayBuffer.dataindex = 0;
}
void playmgrStart(void)
{
// set play mode
PlayMode = PLAYMGR_MODE_PLAY;
// initiate interrupt-driven sending
// by sending first byte
outp(PlayBuffer.dataptr[PlayBuffer.dataindex++], SPDR);
// decrement the data length
PlayBuffer.datalength--;
}
void playmgrStop(void)
{
// set play mode
PlayMode = PLAYMGR_MODE_STOP;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -