⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 soundinstance.c

📁 Ming is a library for generating Macromedia Flash files (.swf), written in C, and includes useful ut
💻 C
字号:
/*    Ming, an SWF output library    Copyright (C) 2002  Opaque Industries - http://www.opaque.net/    This library is free software; you can redistribute it and/or    modify it under the terms of the GNU Lesser General Public    License as published by the Free Software Foundation; either    version 2.1 of the License, or (at your option) any later version.    This library 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    Lesser General Public License for more details.    You should have received a copy of the GNU Lesser General Public    License along with this library; if not, write to the Free Software    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA*/#include <stdlib.h>#include "soundinstance.h"#include "sound.h"#include "block.h"#include "method.h"#include "character.h"#include "libming.h"typedef struct{	unsigned int mark44;	unsigned short level0;	unsigned short level1;} envPoint;struct SWFSoundInstance_s{	struct SWFBlock_s block;	SWFSound sound;	unsigned int inPoint;	unsigned int outPoint;	int numLoops;	byte flags;	byte numEnvPoints;	envPoint *envPoints;};void writeSWFSoundInstanceToMethod(SWFBlock block,																	 SWFByteOutputMethod method, void *data){	SWFSoundInstance sound;	byte flags;	int i;	// block may be null if we're calling from button.c:	if ( block == NULL )	{		method(0, data);		method(0, data);		method(0, data);		return;	}	sound = (SWFSoundInstance)block;	flags = sound->flags;	if ( sound->sound )		methodWriteUInt16(CHARACTERID(sound->sound), method, data);	else		methodWriteUInt16(0, method, data);	 /* 0 means NULL character */	method(flags, data);	if ( flags & SWF_SOUNDINFO_HASINPOINT )		methodWriteUInt32(sound->inPoint, method, data);	if ( flags & SWF_SOUNDINFO_HASOUTPOINT )		methodWriteUInt32(sound->outPoint, method, data);	if ( flags & SWF_SOUNDINFO_HASLOOPS )		methodWriteUInt16(sound->numLoops, method, data);	if ( flags & SWF_SOUNDINFO_HASENVELOPE )	{		method(sound->numEnvPoints, data);		for ( i=0; i<sound->numEnvPoints; ++i )		{			methodWriteUInt32((sound->envPoints[i]).mark44, method, data);			methodWriteUInt16((sound->envPoints[i]).level0, method, data);			methodWriteUInt16((sound->envPoints[i]).level1, method, data);		}	}}int completeSWFSoundInstance(SWFBlock block){	SWFSoundInstance sound;	byte flags;	// block may be null if we're calling from button.c:	if ( block == NULL )		return 3;	sound = (SWFSoundInstance)block;	flags = sound->flags;	return 3 /* (sound id + flags) */ +		((flags & SWF_SOUNDINFO_HASINPOINT) ? 4 : 0) +		((flags & SWF_SOUNDINFO_HASOUTPOINT) ? 4 : 0) +		((flags & SWF_SOUNDINFO_HASLOOPS) ? 2 : 0) +		((flags & SWF_SOUNDINFO_HASENVELOPE) ? (1 + 8*sound->numEnvPoints) : 0);}/* * adds a SoundEnvelope to event sound */void SWFSoundInstance_addEnvelope(SWFSoundInstance inst,                                  unsigned int mark44 /* position in 44khz samples */,                                   short left /* volume left channel */,                                   short right /* volume right channel */){	inst->flags |= SWF_SOUNDINFO_HASENVELOPE;	inst->envPoints = (envPoint*) realloc(inst->envPoints, 		(inst->numEnvPoints + 1) * sizeof(envPoint));	inst->envPoints[inst->numEnvPoints].mark44 = mark44;	inst->envPoints[inst->numEnvPoints].level0 = left;	inst->envPoints[inst->numEnvPoints].level1 = right;	inst->numEnvPoints++;}/*  * private constructor * see SWFMove[Clip]_startSound() */SWFSoundInstance newSWFSoundInstance(SWFSound sound){	SWFSoundInstance instance = (SWFSoundInstance)malloc(sizeof(struct SWFSoundInstance_s));	SWFBlock block = (SWFBlock)instance;	SWFBlockInit(block);	block->type = SWF_STARTSOUND;	block->writeBlock = writeSWFSoundInstanceToMethod;	block->complete = completeSWFSoundInstance;	/* block->dtor = destroySWFStartSoundBlock; */	instance->sound = sound;	instance->inPoint = 0;	instance->outPoint = 0;	instance->numLoops = 0;	instance->flags = 0;	instance->numEnvPoints = 0;	instance->envPoints = NULL;	return instance;}/*  * destroys a SWFSounInstance object */voiddestroySWFSoundInstance(SWFSoundInstance soundInstance){	destroySWFBlock((SWFBlock) soundInstance);}SWFSoundInstance newSWFSoundInstance_stop(SWFSound sound){	SWFSoundInstance instance = newSWFSoundInstance(sound);	instance->flags = SWF_SOUNDINFO_SYNCSTOPSOUND;	return instance;}SWFSoundInstance newSWFSoundInstance_startNoMultiple(SWFSound sound){	SWFSoundInstance instance = newSWFSoundInstance(sound);	instance->flags = SWF_SOUNDINFO_SYNCNOMULTIPLE;	return instance;}/* * don't start sound if already playing  */void SWFSoundInstance_setNoMultiple(SWFSoundInstance instance){	instance->flags |= SWF_SOUNDINFO_SYNCNOMULTIPLE;}/*  * set loop start point * Sets the loop start point counted in samples */void SWFSoundInstance_setLoopInPoint(SWFSoundInstance instance,                                      unsigned int point /* number of samples */){	instance->flags |= SWF_SOUNDINFO_HASINPOINT;	instance->inPoint = point;	}/*  * set loop stop point * Sets the loop's last sample to play */void SWFSoundInstance_setLoopOutPoint(SWFSoundInstance instance,                                       unsigned int point /* number of samples */){	instance->flags |= SWF_SOUNDINFO_HASOUTPOINT;	instance->outPoint = point;	}/* * sets loop count */void SWFSoundInstance_setLoopCount(SWFSoundInstance instance, int count /* loop count */){	instance->flags |= SWF_SOUNDINFO_HASLOOPS;	instance->numLoops = count;}/* * Local variables: * tab-width: 2 * c-basic-offset: 2 * End: */

⌨️ 快捷键说明

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