亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? sound.cpp

?? Evc編的一個在wince5.0上運行的flash播放器
?? CPP
字號:
/////////////////////////////////////////////////////////////
// Flash Plugin and Player
// Copyright (C) 1998,1999 Olivier Debon
// 
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License
// as published by the Free Software Foundation; either version 2
// of the License, or (at your option) any later version.
// 
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
// 
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
// 
///////////////////////////////////////////////////////////////
//  Author : Olivier Debon  <odebon@club-internet.fr>
//

#include "swf.h"


//#include <unistd.h>
//#include <fcntl.h>
//#include <sys/ioctl.h>
#ifndef NOSOUND
//#include <linux/soundcard.h>
#include <windows.h>
#include <mmsystem.h>
#include <math.h>
#endif

#define	WAV_BUFFERS				1

#define BUFF_AHEAD              8
#define	WAV_MASK				0x1F
#define	WAV_BUFFER_SIZE			0x40000
#define SECONDARY_BUFFER_SIZE	0x10000


#ifdef RCSID
static char *rcsid = "$Id: sound.cc,v 1.11 1999/01/31 21:14:22 olivier Exp $";
#endif

#define PRINT 0

//////////// SOUND

Sound::Sound(long id) : Character(SoundType, id)
{
	samples = 0;
	stereo = 0;
	soundRate = 0;
	sampleSize = 1;
}

Sound::~Sound()
{
	if (samples) {
		delete samples;
	}
}

void
Sound::setSoundFlags(long f) {
	switch (GET_SOUND_RATE_CODE(f)) {
		case 0:
			soundRate = 5500;
			break;
		case 1:
			soundRate = 11000;
			break;
		case 2:
			soundRate = 22000;
			break;
		case 3:
			soundRate = 44000;
			break;
	}
	if (f & soundIs16bit) {
		sampleSize = 2;
	}
	if (f & soundIsStereo) {
		stereo = 1;
	}

#if PRINT
	printf("-----\nFlags = %2x\n", f);
	printf("Rate = %d kHz  ", soundRate);
	printf("SampleSize = %d byte(s) ", sampleSize);
	if (f & soundIsStereo) {
		printf("Stereo  ");
	} else {
		printf("Mono  ");
	}
	if (f & soundIsADPCMCompressed) {
		printf("ADPCM\n");
	} else {
		printf("Raw\n");
	}
#endif
}

char *
Sound::setNbSamples(long n) {
	long size;

	nbSamples = n;

	size = nbSamples * (stereo ? 2 : 1) * sampleSize;

	samples = new char[ size ];

	memset((char *)samples,0, size);

	return samples;
}

long
Sound::getRate() {
	return soundRate;
}

long
Sound::getChannel() {
	return stereo ? 2 : 1;
}

long
Sound::getNbSamples() {
	return nbSamples;
}

long
Sound::getSampleSize() {
	return sampleSize;
}

char *
Sound::getSamples() {
	return samples;
}

//////////// SOUND MIXER

long  SoundMixer::dsp = -1;	// Init of descriptor
long  SoundMixer::blockSize = 0;	// Driver sound buffer size
long  SoundMixer::nbInst = 0;	// Nb SoundMixer instances
long  SoundMixer::sampleSize = 0;
long  SoundMixer::stereo = 0;
long  SoundMixer::soundRate = 0;
char *SoundMixer::buffer = 0;

HANDLE		   hData;

HGLOBAL		hWaveHdr;
LPWAVEHDR	lpWaveHdr;

HWAVEOUT    hWaveOut; 

WAVEOUTCAPS	wavecaps;

DWORD	    gSndBufSize;

BOOL waveInit = FALSE;


SoundMixer::SoundMixer(char *device)
{
#ifndef NOSOUND
	WAVEFORMATEX  format; 
	int				i;
	HRESULT			hr;

	list = 0;	// No sound to play

	if (nbInst++) {
		// Device is already open
		return;
	}

	memset (&format, 0, sizeof(format));
	format.wFormatTag       = WAVE_FORMAT_PCM;
	format.nChannels        = 2;
	format.wBitsPerSample   = 16;
	format.nSamplesPerSec   = 11025;
	format.nBlockAlign      = format.nChannels*format.wBitsPerSample / 8;
	format.cbSize           = 0;
	format.nAvgBytesPerSec  = format.nSamplesPerSec*format.nBlockAlign;
	
	// Open a waveform device for output using window callback.
	hr = waveOutOpen((LPHWAVEOUT)&hWaveOut, WAVE_MAPPER, 
            &format, 0, 0L, CALLBACK_NULL);
	if (hr != MMSYSERR_NOERROR) {
	//	perror("open dsp");
		MessageBox(NULL, _T("waveOutOpen error"), _T(""), MB_SETFOREGROUND);
		dsp = -1;
		return;
	} else {
		dsp = 1;
	}


	stereo = 1;
	sampleSize = 2;
	soundRate = 11000;

	blockSize = WAV_BUFFERS*WAV_BUFFER_SIZE;

	buffer = (char *)malloc(blockSize);
	if (buffer == 0) {
		return;
	}
	memset (buffer, 0, blockSize);

	lpWaveHdr = (LPWAVEHDR)malloc((DWORD) sizeof(WAVEHDR) * WAV_BUFFERS);

	//if (hWaveHdr == NULL)
	if (lpWaveHdr == NULL)
       { 
		MessageBox(NULL, _T("malloc error"), _T(""), MB_SETFOREGROUND);
		return; 
    } 
	memset (lpWaveHdr, 0, sizeof(WAVEHDR) * WAV_BUFFERS);
	for (i = 0; i < WAV_BUFFERS; i++)
       {
		lpWaveHdr[i].dwBufferLength = WAV_BUFFER_SIZE; 
		lpWaveHdr[i].lpData = buffer + i*WAV_BUFFER_SIZE;
		
		if ((hr = waveOutPrepareHeader(hWaveOut, lpWaveHdr+i, sizeof(WAVEHDR))) != MMSYSERR_NOERROR)
           {
			TCHAR szErr[256];
			wsprintf(szErr, _T("waveOutPrepareHeader error %d %d ... "), GetLastError(), hr);
			MessageBox(NULL, szErr, _T(""), MB_SETFOREGROUND);
			return;
           }
       }
/*
    for (i = 0; i < NUM_CHANNELS; i++)
       {
        ResetChannel(i);
       }
*/

	waveInit = TRUE;

#endif	/* NOSOUND */
}

SoundMixer::~SoundMixer
()
{
#ifndef NOSOUND
	if (--nbInst == 0) {
		int i;
	   if ( hWaveOut )
		   {
			waveOutReset(hWaveOut);

			if (lpWaveHdr)
			   {
				for (i = 0; i < WAV_BUFFERS; i++)
				   {
					waveOutUnprepareHeader (hWaveOut, lpWaveHdr+i, sizeof(WAVEHDR));
				   }
			   }

			waveOutClose (hWaveOut);

			//if (hWaveHdr)
			if (lpWaveHdr)
			   {
				// These functions are not supported in Windows CE
				//GlobalUnlock(hWaveHdr);
				//GlobalFree(hWaveHdr);
				free(lpWaveHdr);
			   }

			if (buffer)
			   {
				free(buffer);
			   }

		   }

		hWaveOut = 0;
		hData = 0;
		hWaveHdr = 0;
		buffer = NULL;
		lpWaveHdr = NULL;
	}
#endif
}

void
SoundMixer::stopSounds()
{
#ifndef NOSOUND
	SoundList *sl,*del;

	for(sl = list; sl; ) {
		del = sl;
		sl = sl->next;
		delete del;
	}
	list = 0;
#endif
}

void
SoundMixer::startSound(Sound *sound)
{
#ifndef NOSOUND
	SoundList *sl;

	if (sound) {
		// Add sound in list
		sl = new SoundList;
		sl->rate = sound->getRate();
		sl->stereo = (sound->getChannel() == 2);
		sl->sampleSize = sound->getSampleSize();
		sl->current = sound->getSamples();
		sl->remaining = sound->getSampleSize()*sound->getNbSamples()*sound->getChannel();
		sl->next = list;
		list = sl;
	}
#endif
}

BOOL firsttime = TRUE;
long
SoundMixer::playSounds()
{
#ifndef NOSOUND
//	audio_buf_info	 bufInfo;
	long		 nbBytes, n;
	SoundList	*sl,*prev;
	int		 status;
	DWORD flags;


	// Init failed
	if (dsp < 0) return 0;

	// No sound to play
	if (list == 0) return 0;

	if (!waveInit) return 0;

	flags = lpWaveHdr[ 0 & WAV_MASK].dwFlags;

	// Get free DMA buffer space
	//status = ioctl(dsp, SNDCTL_DSP_GETOSPACE, &bufInfo);
	if (firsttime) {
		firsttime = FALSE;
        waveOutRestart(hWaveOut);
		flags = WHDR_DONE;
	}

	if (!(flags & WHDR_DONE)) {
		return 0;
	} else {
		firsttime = TRUE;
	}

	if (firsttime) {
		firsttime = FALSE;
        waveOutRestart(hWaveOut);
	}

	// Free space is not large enough to output data without blocking
	// But there are still sounds to play. We must wait.
	//if (bufInfo.bytes < blockSize) return 1;

	nbBytes = 0;

	// Fill buffer with silence.
	memset((void*)buffer, 0, blockSize);

	prev = 0;
	sl = list;
	while(sl) {

		// Ask sound to fill the buffer
		// according to device capabilities
		n = fillSoundBuffer(sl, buffer, blockSize);

		// Remember the largest written size
		if (n > nbBytes) {
			nbBytes = n;
		}

		// No more samples for this sound
		if (sl->remaining == 0) {
			// Remove sound from list
			if (prev) {
				prev->next = sl->next;
				delete sl;
				sl = prev->next;
			} else {
				list = sl->next;
				delete sl;
				sl = list;
			}
		} else {
			sl = sl->next;
		}
	}

	if (nbBytes) {
		// At last ! Play It !
		//write(dsp,buffer,nbBytes);
		int hr;
		lpWaveHdr[0].dwBufferLength = nbBytes;
		if ((hr = waveOutWrite(hWaveOut, &lpWaveHdr[0&WAV_MASK], sizeof(WAVEHDR))) != MMSYSERR_NOERROR) { 
			TCHAR szErr[256];
			wsprintf(szErr, _T("waveOutWrite error %d %d ... "), GetLastError(), hr);
			//MessageBox(NULL, szErr, _T(""), MB_SETFOREGROUND);
			return 0;
		}
		//status = ioctl(dsp, SNDCTL_DSP_POST);
	}

	return nbBytes;
#else
	return 0;
#endif
}

long
SoundMixer::fillSoundBuffer(SoundList *sl, char *buff, long buffSize)
{
	long sampleLeft, sampleRight;
	long skipOut, skipOutInit;
	long skipIn, skipInInit;
	long freqRatio;
	long totalOut = 0;

	sampleLeft = sampleRight = 0;
	skipOutInit = skipInInit = 0;

	freqRatio = sl->rate / soundRate;
	if (freqRatio) {
		skipOutInit = freqRatio - 1;
		skipInInit = 0;
	}

	freqRatio = soundRate / sl->rate;
	if (freqRatio) {
		skipInInit = freqRatio - 1;
		skipOutInit = 0;
	}

	skipOut = skipOutInit;
	skipIn = skipInInit;
	while (buffSize && sl->remaining) {
		if (skipIn-- == 0) {
			// Get sampleLeft
			if (sl->sampleSize == 2) {
				sampleLeft = (long)(*(short *)(sl->current));
				if (sampleSize == 1) {
					sampleLeft = (sampleLeft >> 8) &0xff;
				}
			} else {
				sampleLeft = (long)*(sl->current);
				if (sampleSize == 2) {
					sampleLeft <<= 8;
				}
			}
			sl->current += sl->sampleSize;
			sl->remaining -= sl->sampleSize;

			if (sl->stereo) {
				// Get sampleRight
				if (sl->sampleSize == 2) {
					sampleRight = (long)(*(short *)(sl->current));
					if (sampleSize == 1) {
						sampleRight = (sampleRight >> 8) &0xff;
					}
				} else {
					sampleRight = (long)*(sl->current);
					if (sampleSize == 2) {
						sampleRight <<= 8;
					}
				}
				sl->current += sl->sampleSize;
				sl->remaining -= sl->sampleSize;

			} else {
				sampleRight = sampleLeft;
			}
			
			skipIn = skipInInit;
		}

		if (skipOut-- == 0) {
			// Output
			if (stereo) {
				if (sampleSize == 2) {
					*((short *)buff) += sampleLeft/2;
					buffSize -= sampleSize;
					buff += sampleSize;
					*((short *)buff) += sampleRight/2;
					buffSize -= sampleSize;
					buff += sampleSize;
				} else {
					*((char *)buff) += sampleLeft/2;
					buffSize -= sampleSize;
					buff += sampleSize;
					*((char *)buff) += sampleRight/2;
					buffSize -= sampleSize;
					buff += sampleSize;
				}
				totalOut += 2*sampleSize;
			} else {
				if (sampleSize == 2) {
					*((short *)buff) += (sampleLeft+sampleRight)>>2;
					buffSize -= sampleSize;
					buff += sampleSize;
				} else {
					*((char *)buff) += (sampleLeft+sampleRight)>>2;
					buffSize -= sampleSize;
					buff += sampleSize;
				}
				totalOut += sampleSize;
			}

			skipOut = skipOutInit;
		}
	}

	return totalOut;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
av一区二区三区| 欧美xxxx在线观看| 欧美成人aa大片| 自拍偷拍欧美激情| 狠狠色丁香久久婷婷综| 欧美专区日韩专区| 国产精品久久久久影视| 久久精品理论片| 欧美日韩亚洲综合在线| 国产麻豆视频精品| 在线视频欧美区| 成人h动漫精品一区二区| 国产精品视频麻豆| 91麻豆精品国产91久久久使用方法 | 极品瑜伽女神91| 欧美日韩午夜在线| 亚洲精品va在线观看| 成人免费高清在线| 欧美国产一区二区| 成人性生交大片免费看中文| 日韩精品一区二区三区swag| 日本亚洲三级在线| 91麻豆精品国产综合久久久久久| 亚洲天堂网中文字| 94-欧美-setu| 日韩伦理av电影| 色妞www精品视频| 一区在线观看免费| 99视频精品免费视频| 国产精品久久久久影院老司| av在线一区二区| 一区二区三区精品在线| 一本大道综合伊人精品热热| 一区二区三区精品视频在线| 欧美在线观看视频在线| 亚洲成人高清在线| 欧美丰满嫩嫩电影| 久久成人久久爱| 久久免费看少妇高潮| 国产精品66部| 综合久久综合久久| 欧美三级电影精品| 日本欧美肥老太交大片| 精品国产凹凸成av人导航| 国产美女娇喘av呻吟久久| 欧美激情一区不卡| 91福利视频久久久久| 日本伊人精品一区二区三区观看方式| 91精品国产91久久综合桃花| 国模一区二区三区白浆| 国产精品网友自拍| 色国产综合视频| 日本女人一区二区三区| 久久女同性恋中文字幕| 99视频一区二区| 日韩中文字幕91| 国产欧美日韩在线| 91激情五月电影| 裸体一区二区三区| 中文字幕视频一区二区三区久| 欧美伊人久久大香线蕉综合69| 日韩二区在线观看| 久久久久99精品国产片| 色婷婷av一区二区三区软件| 久久精品免费看| 亚洲摸摸操操av| 精品久久国产老人久久综合| 国产成人在线观看| 亚洲午夜私人影院| 中文子幕无线码一区tr| 欧美三级资源在线| 国产激情一区二区三区| 五月天视频一区| 中文字幕 久热精品 视频在线 | 一区二区三区蜜桃网| 日韩久久精品一区| 91久久精品一区二区三| 国产一区二区精品久久99| 亚洲综合小说图片| 国产精品热久久久久夜色精品三区| 在线观看日韩电影| 成人亚洲一区二区一| 另类小说欧美激情| 一区二区三区影院| 国产精品久久久久久福利一牛影视| 欧美伦理影视网| 一本色道久久综合亚洲精品按摩| 国产在线精品免费| 日日摸夜夜添夜夜添精品视频| 国产精品成人免费| 国产亚洲精品7777| 日韩一区二区三区电影在线观看| 色婷婷精品久久二区二区蜜臂av| 国产成人av福利| 另类小说综合欧美亚洲| 亚洲成人免费av| 亚洲一区二区三区中文字幕| 亚洲欧洲成人精品av97| 国产欧美日韩不卡| 国产片一区二区| 国产女同互慰高潮91漫画| 精品成人a区在线观看| 日韩女优av电影在线观看| 欧美一级夜夜爽| 3atv一区二区三区| 欧美精品aⅴ在线视频| 在线观看国产日韩| 在线免费观看视频一区| 日本韩国欧美在线| 一本一本久久a久久精品综合麻豆| 成人自拍视频在线| 成人伦理片在线| 成人黄色777网| 99久久精品国产观看| 91蝌蚪porny九色| 99视频超级精品| 在线日韩国产精品| 777午夜精品视频在线播放| 欧美日本韩国一区| 日韩一级精品视频在线观看| 欧美一区二区视频在线观看 | 久久草av在线| 国内精品自线一区二区三区视频| 久久国产精品第一页| 国产又黄又大久久| 福利一区二区在线| 91美女片黄在线观看| 色香蕉久久蜜桃| 91麻豆精品国产综合久久久久久| 日韩一二在线观看| 国产午夜亚洲精品理论片色戒 | 中文在线一区二区| 日韩理论片一区二区| 亚洲成人av免费| 国内精品伊人久久久久av一坑 | 91精品国产高清一区二区三区蜜臀| 欧美剧情片在线观看| 日韩三级精品电影久久久| 久久久www免费人成精品| 中文字幕在线不卡一区二区三区| 一区二区三区中文字幕精品精品| 图片区小说区国产精品视频| 国产一区二区导航在线播放| bt7086福利一区国产| 欧美日韩一卡二卡三卡 | 秋霞影院一区二区| 国产成人综合视频| 欧美综合视频在线观看| 久久亚洲综合色| 亚洲图片一区二区| 国产精品18久久久久久久久久久久| 91同城在线观看| 欧美va天堂va视频va在线| 最好看的中文字幕久久| 麻豆91免费观看| 91福利资源站| 国产色一区二区| 视频一区在线播放| 91亚洲国产成人精品一区二区三| 日韩欧美中文字幕一区| 亚洲免费观看高清完整版在线观看| 欧美aaa在线| 欧洲人成人精品| 国产精品亲子伦对白| 免费人成在线不卡| 91福利资源站| 中文字幕一区二区三区在线观看 | 日韩中文字幕一区二区三区| av在线播放成人| 久久久精品免费网站| 日本欧美在线看| 欧美性受xxxx| 日韩一区中文字幕| 国产成人免费网站| 日韩欧美一级在线播放| 亚洲午夜精品17c| 99久久精品国产导航| 国产精品天干天干在观线| 精品中文字幕一区二区| 欧美日韩一区视频| 亚洲精品国产无天堂网2021| 懂色一区二区三区免费观看| 91精品国产福利| 日韩激情视频在线观看| 欧美日韩国产综合一区二区 | 国产亚洲成aⅴ人片在线观看 | 日韩欧美国产系列| 亚洲bt欧美bt精品| 色婷婷综合久久久久中文一区二区 | 伊人婷婷欧美激情| 91丨porny丨国产| 国产精品乱人伦一区二区| 国产精品一区免费视频| 久久久av毛片精品| 国产成人av电影免费在线观看| 久久久99久久精品欧美| 国产成人自拍网| 国产精品午夜久久| 91视频一区二区三区| 亚洲免费伊人电影|