wavplay.cpp

来自「用QT,designer编写的游戏」· C++ 代码 · 共 100 行

CPP
100
字号
#include "wavplay.h"WavePlay::WavePlay(int bufSize, QString deviceName):QObject(){	sndFd = open((const char *)deviceName, O_WRONLY);	place = sizeof(WH);	buffer = NULL;	fileSize = 0;	bufferSize = bufSize;	wavFd = -1;	playState = 0;}WavePlay::~WavePlay(){	if(buffer) munmap(buffer, fileSize);	if(sndFd) close(sndFd);	if(wavFd >= 0) close(wavFd);}void WavePlay::readWaveHead(){	pHead = (WH *)buffer;}void WavePlay::soundCardCtl(){	int tmp;	ioctl(sndFd, SNDCTL_DSP_RESET) ;	//soundcard init	tmp = pHead->bits;	ioctl(sndFd, SNDCTL_DSP_SETFMT, (char *)&tmp); //set sound format	tmp = pHead->channel;	ioctl(sndFd, SNDCTL_DSP_CHANNELS, (char *)&tmp);//set channel	tmp = pHead->rate;	ioctl(sndFd, SNDCTL_DSP_SPEED, (char *)&tmp);	//set sound bps}void WavePlay::openSound(QString fName){	fileName = fName;	if(fileName == QString("") || ! QFile::exists(fileName))		return;	if(fileName.right(4) != QString(".wav"))		return;	wavFd = open((const char *)fileName, O_RDWR);	QFile *f = new QFile(fileName);	fileSize = f->size();	buffer = (unsigned char *)mmap(0, fileSize, PROT_READ | PROT_WRITE,				MAP_SHARED, wavFd, 0);	free(f);	place = sizeof(WH);	readWaveHead();	soundCardCtl();}void WavePlay::closeSound(){}void WavePlay::play(){	while(place < fileSize)	{		if(playState == 0)		{			place += write(sndFd, buffer + place,  bufferSize);			emit placeChanged(100 * (place - sizeof(WH)) 							/ (fileSize - sizeof(WH)));		}else if(playState == 1)		{			closeSound();			return;		}else if(playState == 2)		{			QTimer::singleShot(200, this, SLOT(play()));		}	}}void WavePlay::pause(){	playState = 2;}void WavePlay::stop(){	playState = 1;}void WavePlay::forward(){}void WavePlay::backward(){}void WavePlay::setPlace(){}//int main(int argc, char *argv[])//{//	WavePlay wp;//	wp.openSound(argv[1]);//	qDebug("ssssssssssssssss");//	wp.play();//	qDebug("ssssssssssssssss");//	wp.stop();//}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?