svnno****@sourc*****
svnno****@sourc*****
2008年 8月 14日 (木) 02:52:03 JST
Revision: 42 http://svn.sourceforge.jp/cgi-bin/viewcvs.cgi?root=swfed&view=rev&rev=42 Author: yoya Date: 2008-08-14 02:52:02 +0900 (Thu, 14 Aug 2008) Log Message: ----------- MLD ファイル入れ替えを実装しました。(未テスト) Modified Paths: -------------- src/php_swfed.h src/swf_object.c src/swf_object.h src/swf_tag.c src/swf_tag.h src/swf_tag_sound.c src/swf_tag_sound.h src/swfed.c Added Paths: ----------- sample/swfreplacemlddata.phps -------------- next part -------------- Added: sample/swfreplacemlddata.phps =================================================================== --- sample/swfreplacemlddata.phps (rev 0) +++ sample/swfreplacemlddata.phps 2008-08-13 17:52:02 UTC (rev 42) @@ -0,0 +1,21 @@ +<?php + +if (($argc < 4) || ($argc%2 != 0)) { + fprintf(STDERR, "Usage: swfreplacemlddata <swf_file> <sound_id> <mld_file> [<sound_id2> <mld_file2> [...]]\n"); + exit(1); +} + +$swf_filename = $argv[1]; + +$swfdata = file_get_contents($swf_filename); +$obj = new SWFEditor(); +$obj->input($swfdata); + +for ($i=2 ; $i< $argc ; $i += 2) { + $sound_id = $argv[$i]; + $mld_filename = $argv[$i+1]; + $mlddata = file_get_contents($mld_filename); + $obj->replaceMLDData($sound_id, $mlddata); +} + +echo $obj->output(); Modified: src/php_swfed.h =================================================================== --- src/php_swfed.h 2008-08-12 14:25:12 UTC (rev 41) +++ src/php_swfed.h 2008-08-13 17:52:02 UTC (rev 42) @@ -59,6 +59,7 @@ PHP_METHOD(swfed, getPNGData); PHP_METHOD(swfed, replacePNGData); PHP_METHOD(swfed, getSoundData); +PHP_METHOD(swfed, replaceMLDData); PHP_METHOD(swfed, getEditString); PHP_METHOD(swfed, replaceEditString); PHP_METHOD(swfed, getActionData); Modified: src/swf_object.c =================================================================== --- src/swf_object.c 2008-08-12 14:25:12 UTC (rev 41) +++ src/swf_object.c 2008-08-13 17:52:02 UTC (rev 42) @@ -320,6 +320,26 @@ return data; } +int +swf_object_replace_melodata(swf_object_t *swf, int sound_id, + unsigned char *melo_data, + unsigned long melo_data_len) { + int result = 1; + swf_tag_t *tag; + if (swf == NULL) { + fprintf(stderr, "swf_object_replace_melodata: swf == NULL\n"); + return 1; + } + for (tag = swf->tag; tag; tag = tag->next) { + result = swf_tag_replace_melo_data(tag, sound_id, + melo_data, melo_data_len); + if (! result) { + break; + } + } + return result; +} + char * swf_object_get_editstring(swf_object_t *swf, char *variable_name, Modified: src/swf_object.h =================================================================== --- src/swf_object.h 2008-08-12 14:25:12 UTC (rev 41) +++ src/swf_object.h 2008-08-13 17:52:02 UTC (rev 42) @@ -37,6 +37,9 @@ unsigned char *png_data, unsigned long png_data_len); extern unsigned char *swf_object_get_sounddata(swf_object_t *swf, unsigned long *length, int sound_id); +extern int swf_object_replace_melodata(swf_object_t *swf, int sound_id, + unsigned char *melo_data, + unsigned long melo_data_len); extern char *swf_object_get_editstring(swf_object_t *swf, char *variable_name, int variable_name_len); Modified: src/swf_tag.c =================================================================== --- src/swf_tag.c 2008-08-12 14:25:12 UTC (rev 41) +++ src/swf_tag.c 2008-08-13 17:52:02 UTC (rev 42) @@ -409,6 +409,10 @@ return result; } +/* + * DefineSound + */ + unsigned char * swf_tag_get_sound_data(swf_tag_t *tag, unsigned long *length, int sound_id) { swf_tag_info_t *tag_info; @@ -431,6 +435,44 @@ return swf_tag_sound_get_sound_data(tag->detail, length, sound_id); } +int +swf_tag_replace_melo_data(swf_tag_t *tag, int sound_id, + unsigned char *melo_data, + unsigned long melo_data_len) { + swf_tag_info_t *tag_info; + int result; + if (tag == NULL) { + fprintf(stderr, "swf_tag_replace_melo_data: tag == NULL\n"); + return 1; + } + if (tag->tag != 14) { // DefineSound + return 1; + } + tag_info = get_swf_tag_info(tag->tag); + if (tag_info && tag_info->detail_handler) { + swf_tag_detail_handler_t * detail_handler = tag_info->detail_handler(); + if (detail_handler->identity) { + if (detail_handler->identity(tag->data, sound_id, tag)) { + return 1; + } + } + } + if (! tag->detail) { + swf_tag_create_detail(tag, NULL); + } + if (! tag->detail) { + fprintf(stderr, "swf_tag_replace_melog_data: Can't create tag\n"); + return 1; + } + result= swf_tag_sound_replace_melo_data(tag->detail, sound_id, + melo_data, melo_data_len); + if (result == 0) { + free(tag->data); + tag->data = NULL; + tag->length = 0; + } + return result; +} char * swf_tag_get_edit_string(swf_tag_t *tag, Modified: src/swf_tag.h =================================================================== --- src/swf_tag.h 2008-08-12 14:25:12 UTC (rev 41) +++ src/swf_tag.h 2008-08-13 17:52:02 UTC (rev 42) @@ -68,6 +68,9 @@ extern unsigned char *swf_tag_get_sound_data(swf_tag_t *tag, unsigned long *length, int sound_id); +extern int swf_tag_replace_melo_data(swf_tag_t *tag, int sound_id, + unsigned char *melo_data, + unsigned long melo_data_len); /* edit text */ extern char *swf_tag_get_edit_string(swf_tag_t *tag, Modified: src/swf_tag_sound.c =================================================================== --- src/swf_tag_sound.c 2008-08-12 14:25:12 UTC (rev 41) +++ src/swf_tag_sound.c 2008-08-13 17:52:02 UTC (rev 42) @@ -182,3 +182,28 @@ // dummy return -1; } + +int +swf_tag_sound_replace_melo_data(void *detail, int sound_id, + unsigned char *melo_data, + unsigned long melo_data_len) { + swf_tag_sound_detail_t *swf_tag_sound = (swf_tag_sound_detail_t *) detail; + (void) melo_data; + (void) melo_data_len; + swf_tag_sound->sound_id = sound_id; + swf_tag_sound->sound_format = 15; + swf_tag_sound->sound_rate = 0; + swf_tag_sound->sound_is_16bits = 0; + swf_tag_sound->sound_is_stereo = 0; + swf_tag_sound->sound_samples_count = 0; + free(swf_tag_sound->sound_data); + swf_tag_sound->sound_data = malloc(melo_data_len); + if (swf_tag_sound->sound_data == NULL) { + fprintf(stderr, "swf_tag_sound_replace_melo_data: swf_tag_sound->sound_data == NULL\n"); + return 1; + } + memcpy(swf_tag_sound->sound_data, melo_data, melo_data_len); + swf_tag_sound->sound_data_len = melo_data_len; + // dummy + return 0; +} Modified: src/swf_tag_sound.h =================================================================== --- src/swf_tag_sound.h 2008-08-12 14:25:12 UTC (rev 41) +++ src/swf_tag_sound.h 2008-08-13 17:52:02 UTC (rev 42) @@ -43,4 +43,8 @@ unsigned char *mp3_data, unsigned long mp3_data_len); +extern int swf_tag_sound_replace_melo_data(void *detail, int sound_id, + unsigned char *sound_data, + unsigned long sound_data_len); + #endif /* __SWF_TAG_SOUND__H__ */ Modified: src/swfed.c =================================================================== --- src/swfed.c 2008-08-12 14:25:12 UTC (rev 41) +++ src/swfed.c 2008-08-13 17:52:02 UTC (rev 42) @@ -63,6 +63,7 @@ PHP_ME(swfed, getPNGData, NULL, 0) PHP_ME(swfed, replacePNGData, NULL, 0) PHP_ME(swfed, getSoundData, NULL, 0) + PHP_ME(swfed, replaceMLDData, NULL, 0) PHP_ME(swfed, getEditString, NULL, 0) PHP_ME(swfed, replaceEditString, NULL, 0) PHP_ME(swfed, getActionData, NULL, 0) @@ -596,6 +597,32 @@ RETURN_STRINGL(new_buff, (int) len, 1); } +PHP_METHOD(swfed, replaceMLDData) { + char *data = NULL; + int data_len = 0; + int sound_id; + swf_object_t *swf; + int result = 0; + switch (ZEND_NUM_ARGS()) { + default: + WRONG_PARAM_COUNT; + RETURN_FALSE; /* XXX */ + case 2: + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ls", &sound_id, &data, &data_len) == FAILURE) { + RETURN_FALSE; + } + break; + } + swf = get_swf_object(getThis()); + result = swf_object_replace_melodata(swf, sound_id, + (unsigned char *)data, + (unsigned long) data_len); + if (result == 0) { + RETURN_FALSE; + } + RETURN_TRUE; +} + PHP_METHOD(swfed, getEditString) { char *var_name; int var_name_len;