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

📄 swfplayer.m

📁 flirt 一款纯c的flash解码程序。
💻 M
字号:
/*
 Flirt, an SWF rendering library
 Copyright (c) 2004-2006 Dave Hayden <dave@opaque.net>
 All rights reserved.
 
 http://www.opaque.net/flirt/

 This code is distributed under the two-clause BSD license.
 Read the LICENSE file or visit the URL above for details
*/

/*
 //#include <CoreAudio/CoreAudio.h>
	//AudioDeviceID outputDevID;

 OSStatus
 waveIOProc(AudioDeviceID inDevice,
			const AudioTimeStamp* inNow,
			const AudioBufferList* inInputData,
			const AudioTimeStamp* inInputTime,
			AudioBufferList* outOutputData,
			const AudioTimeStamp* inOutputTime,
			void* inContext)
 {
	 float* buffer = outOutputData->mBuffers[0].mData;
	 UInt32 bufferSize = outOutputData->mBuffers[0].mDataByteSize;
	 UInt32 numChannels = outOutputData->mBuffers[0].mNumberChannels;
	 
	 ddSoundMixer* mixer = (ddSoundMixer*)inContext;
	 
	 if ( !dd_mixerCallback(buffer, bufferSize) )
	 {
		 dd_warn("audioCallback underrun!");
		 ddSoundMixer_stop(mixer);
		 return kAudioHardwareUnspecifiedError;
	 }
	 
	 return kAudioHardwareNoError;
 }
 
 {
	 AudioDeviceID outputDevID;
	 ddSoundMixer* mixer = dd_malloc(sizeof(ddSoundMixer));
	 
	 OSStatus status;
	 UInt32 size;
	 
	 size = sizeof(outputDevID);
	 status = AudioHardwareGetProperty(kAudioHardwarePropertyDefaultOutputDevice, &size, &outputDevID);
	 
	 if ( status )
	 {
		 dd_warn("AudioHardwareGetProperty status %d", status);
		 return NULL;
	 }
	 
	 size = sizeof(bufferByteCount);
	 bufferByteCount = MIXER_BUFFER_SIZE * sizeof(float);
	 
	 status = AudioDeviceSetProperty(outputDevID, NULL, 0, DD_FALSE, kAudioDevicePropertyBufferSize, size, &bufferByteCount);
	 
	 if ( status )
	 {
		 dd_warn("AudioDeviceSetProperty setting buffer size status %d", status);
		 return NULL;
	 }
	 
	 status = AudioDeviceAddIOProc(outputDevID, waveIOProc, mixer);
	 
	 if ( status )
	 {
		 dd_warn("AudioDeviceAddIOProc status %d", status);
		 return NULL;
	 }
	 
	 mixer->outputDevID = outputDevID;
	 mixer->playing = DD_FALSE;
	 
	 return mixer;
 }

 void
 ddSoundMixer_start(ddSoundMixer* mixer)
 {
#ifdef DD_PLATFORM_MAC_OS_X
	 OSStatus status;
	 
	 status = AudioDeviceStart(mixer->outputDevID, waveIOProc);
	 
	 if ( status )
		 dd_warn("AudioDeviceStop status %d", status);
	 
	 mixer->playing = DD_TRUE;
#endif DD_PLATFORM_MAC_OS_X
 }
 
 
 void
 ddSoundMixer_stop(ddSoundMixer* mixer)
 {
#ifdef DD_PLATFORM_MAC_OS_X
	 OSStatus status;
	 
	 status = AudioDeviceStop(mixer->outputDevID, waveIOProc);
	 
	 if ( status )
		 dd_warn("AudioDeviceStop status %d", status);
	 
	 mixer->playing = DD_FALSE;
#endif DD_PLATFORM_MAC_OS_X
 }
 
 */


#import "FlashView.h"
#import "SWFAction.h"
#import "SWFActionObject.h"
#import "SWFDrawable.h"
#import "SWFMovieClip.h"
#import "SWFPlayer.h"

void
setupImageClass(ddPlayer* player);

@implementation SWFPlayer

+ (id)player
{
	return [[[self alloc] init] autorelease];
}


- (id)init
{
	if ( (self = [super init]) == nil )
		return nil;
	
	player = nil;

	return self;
}


- (void)dealloc
{
	[root release];
	[globals release];
	
	dd_destroyPlayer(player);

	[super dealloc];
}


- (ddPlayer*)ddPlayer
{
	return player;
}


- (SWFMovieClip*)movieClip
{
	return [SWFMovieClip clipWithDDMovieClip:ddPlayer_getMovieClip(player)];
}


- (SWFDrawable*)drawClip
{
	return [SWFDrawable drawableWithDDDrawable:(ddDrawable*)ddPlayer_getPlayClip(player)];
}


- (float)frameRate
{
	return ddPlayer_getFrameRate(player);
}


- (void)keyDown:(unichar)c
{
	ddPlayer_doKeyDown(player, c);
}


- (void)keyUp:(unichar)c
{
	ddPlayer_doKeyUp(player, c);
}


- (BOOL)loadMovieAtPath:(NSString*)path forFlashView:(FlashView*)view
{
	ddImage* image = [view image];
	FILE* f = fopen([path cString], "r");
	player = dd_newPlayer_file(f, image);

	if ( ddPlayer_readMovie(player) < 0 )
		return NO;

	setupImageClass(player);
	
	ddImage_clear(image, ddPlayer_getBackgroundColor(player));

	return YES;
}


- (void)mouseDown:(NSPoint)point
{
	ddPlayer_doMouseDown(player, point.x, point.y);
}


- (void)mouseUp:(NSPoint)point
{
	ddPlayer_doMouseUp(player, point.x, point.y);
}


- (ddCursorType)mouseMoved:(NSPoint)point
{
	return ddPlayer_doMouseMove(player, point.x, point.y);
}


- (void)replaceImage:(ddImage*)image
{
	ddPlayer_setImage(player, image);
}


- (void)setTraceFunction:(void*)func userData:(void*)data
{
	dd_setActionTraceFunction(player, func, data);
}


- (SWFActionObject*)globals
{
	if ( globals == nil )
		globals = [[SWFActionObject objectWithDDActionObject:ddPlayer_getGlobals(player)] retain];
	
	return globals;
}


- (SWFActionObject*)root
{
	if ( root == nil )
		root = [[SWFActionObject objectWithDDActionObject:(ddActionObject*)ddPlayer_getRootClip(player)] retain];

	return root;
}


- (SWFAction*)currentAction
{
	return [self actionAtFrameDepth:0];
}


- (int)actionOffsetAtFrameDepth:(int)depth
{
	ddActionContext* context = ddPlayer_actionContextAtDepth(player, depth);
	return ddActionContext_getActionOffset(context);
}


- (int)actionStackDepth
{
	return ddPlayer_actionStackDepth(player);
}


- (NSString*)actionNameAtFrameDepth:(int)depth
{
	ddActionContext* context = ddPlayer_actionContextAtDepth(player, depth);
	char* name = ddActionContext_getLabel(context);
	
	if ( name != NULL )
		return [NSString stringWithCString:name];
	else
		return @"no name";
}


- (SWFAction*)actionAtFrameDepth:(int)depth
{
	ddActionContext* context = ddPlayer_actionContextAtDepth(player, depth);
	
	if ( context != NULL )
		return [SWFAction actionWithDDAction:ddActionContext_getAction(context)];
	else
		return nil;
}


- (BOOL)stepFrame:(ddRect**)rectsPtr nRects:(int*)countPtr mode:(ddStepMode)mode
{
	if ( !hitBreakpoint )
		ddPlayer_step(player);
	
	if ( ddPlayer_executeFrameActions(player, mode) )
	{
		// hit a breakpoint
		hitBreakpoint = YES;
		
		return NO;
	}
	else
	{
		ddPlayer_updateDisplay(player, rectsPtr, countPtr);

		[globals release];
		globals = nil;

		[root release];
		root = nil;

		hitBreakpoint = NO;
		
		SInt16 soundbuffer[2 * 44000];
		int size = 2 * 44000;
		
		ddPlayer_renderFrameSoundIntoBuffer(player, soundbuffer, &size);
		
		return YES;
	}
}

@end

⌨️ 快捷键说明

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