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

📄 sound_decomp.c.svn-base

📁 A Flash Player with ActionScript support. Write in C and C++. It have two part, one is Player and an
💻 SVN-BASE
字号:
#include <stdio.h>#include <stdlib.h>#include <pthread.h>#include <assert.h>#include "sound_mixplay_pub.h"#include "sound_decomp.h"#include "player_pub.h"#include "swf_file_pub.h"#include "instance.h"#include <glib.h>extern player_t      *player_p;// 解压缩 MP3void snd_stream_add(GNode *node_p,struct SoundStreamBlock *in) {    struct mpstr	*mp;    struct pcm_block	*node;    struct pcm_block	*p;    struct pcm_block	*prvp;    int			ret;    instance_t 		*data_p = (instance_t*)(node_p->data);    p = player_p->pcm_block_head.downchannel_p;    prvp = &(player_p->pcm_block_head);    // 如果 in 中数据为空,直接返回.    if ((in->Count)-4 == 0)        return ;    assert(pthread_mutex_lock(&player_p->pcm_block_mutex) == 0);    printf("stream sound data %s \n",data_p->name_p);    //    printf("snd_stream_add lock \n");    // 寻找自己所属的 Channel;    while (p != NULL) {        if ((p->channel_p != NULL) && (p->channel_p->type == STREAM_CHANNEL) && (p->channel_p->belong_node_p == node_p)) {            mp = &(p->channel_p->mp);            break;        };        prvp = p;        p = p->downchannel_p;    };    assert(p != NULL);    // 在 channel 中,找到链表尾    while (p->next_p != NULL) {        //    	printf("next %p\n",p->next_p);        p = p->next_p;    };    // 做新的节点并挂到链表尾.    node = calloc(1,sizeof(struct pcm_block));    //  	printf("new1 %p\n",node);    ret = decodeMP3(mp,(in->StreamSoundData)+4,(in->Count)-4                    ,node->data,BUF_LENGTH,&(node->length));    if (ret == MP3_OK) {        p->next_p = node;        p = node;    } else {        free(node);    }    while(ret == MP3_OK) {        node = calloc(1,sizeof(struct pcm_block));        //     	printf("new2 %p\n",node);        ret = decodeMP3(mp,NULL,0,node->data,BUF_LENGTH,&(node->length));        if (ret == MP3_OK) {            p->next_p = node;            p = node;        } else {            free(node);        }    };    assert(pthread_mutex_unlock(&player_p->pcm_block_mutex) == 0);    //    printf("snd_stream_add unlock \n");}void snd_stream_create(GNode *node_p,struct SoundStreamHead *in) {    struct pcm_block	*p;    struct pcm_block	*prvp;    struct channel	*chp;    instance_t 		*data_p = (instance_t*)(node_p->data);    p = player_p->pcm_block_head.downchannel_p;    prvp = &(player_p->pcm_block_head);    assert(pthread_mutex_lock(&player_p->pcm_block_mutex) == 0);    printf("stream sound create %s \n",data_p->name_p);    //    printf("snd_stream_create lock \n");    //    printf("add channel for %d\n",in->BelongTo);    // 如果 MoveClip 已经有 Channel 则修改;    while (p != NULL) {        if ((p->channel_p != NULL) && (p->channel_p->type == STREAM_CHANNEL) && (p->channel_p->belong_node_p == node_p)) {            chp = p->channel_p ;            chp->belong_node_p = node_p;            chp->sample_size = ((in->StreamSoundFlags & D16Bit) >> 1) ? 16 : 8 ;            chp->mono_stereo = ((in->StreamSoundFlags & Stereo)) ? 2 : 1;            switch (in->StreamSoundFlags & D44KH) {            case D5_5KH:                chp->dsp_speed = 5512;                break;            case D11KH:                chp->dsp_speed = 11025;                break;            case D22KH:                chp->dsp_speed = 22050;                break;            case D44KH:                chp->dsp_speed = 44100;                break;            };            break;        };        prvp = p;        p = p->downchannel_p;    };    // 如没找到,则建立新的 Channel ,并加入链表中    if (p == NULL) {        // 建新的 Channel 结构        chp = calloc(1,sizeof(struct channel));        chp->type = STREAM_CHANNEL;        chp->belong_node_p = node_p;        chp->sample_size = ((in->StreamSoundFlags & D16Bit) >> 1) ? 16 : 8 ;        chp->mono_stereo = ((in->StreamSoundFlags & Stereo)) ? 2 : 1;        switch (in->StreamSoundFlags & D44KH) {        case D5_5KH:            chp->dsp_speed = 5512;            break;        case D11KH:            chp->dsp_speed = 11025;            break;        case D22KH:            chp->dsp_speed = 22050;            break;        case D44KH:            chp->dsp_speed = 44100;            break;        };        InitMP3(&(chp->mp));        p = calloc(1,sizeof(struct pcm_block));        prvp->downchannel_p = p;        p->upchannel_p = prvp;        p->channel_p = chp;    };    assert(pthread_mutex_unlock(&player_p->pcm_block_mutex) == 0);    //    printf("snd_stream_create unlock \n");}void snd_define_create(GNode *node_p, struct StartSound *in) {    struct pcm_block	*node;    struct pcm_block	*p;    struct pcm_block	*prvp;    int			length,ret,size;    struct DefineSound	*define_sound_p;    struct channel      *chp;    swf_file_t		*swf_p = ((instance_t*)node_p->data)->swf_p;    instance_t 		*data_p = (instance_t*)(node_p->data);    assert(pthread_mutex_lock(&player_p->pcm_block_mutex) == 0);    printf("define sound trigge %s flags %d \n",data_p->name_p,in->SoundInfoP->Flags);    //    printf("snd_define_create lock \n");    p = player_p->pcm_block_head.downchannel_p;    prvp = &(player_p->pcm_block_head);    if ((in->SoundInfoP->Flags & SyncNoMultiple) || (in->SoundInfoP->Flags & SyncStop) ||(in->SoundInfoP->Flags & HasLoops	) )        while (p != NULL) {            if ((p->channel_p != NULL) && (p->channel_p->type == DEFINE_CHANNEL) && (p->channel_p->belong_node_p == node_p)) {                assert(pthread_mutex_unlock(&player_p->pcm_block_mutex) == 0);                return;            };            prvp = p;            p = p->downchannel_p;        };/*	if(in->SoundInfoP->Flags & HasLoops	){        while (p != NULL) {            if ((p->channel_p != NULL) && (p->channel_p->type == DEFINE_CHANNEL) && (p->channel_p->belong_node_p == node_p)) {                assert(pthread_mutex_unlock(&player_p->pcm_block_mutex) == 0);                return;            };            prvp = p;            p = p->downchannel_p;        };	}*/		// 找到链尾;		while (p != NULL) {			prvp = p;			p = p->downchannel_p;		};    define_sound_p = (struct DefineSound*)(swf_p->dict_p->dict[in->SoundId]);    chp = calloc(1,sizeof(struct channel));    chp->type = DEFINE_CHANNEL;    chp->belong_node_p = node_p;    chp->sample_size = ((define_sound_p->SoundFlags & D16Bit) >> 1) ? 16 : 8 ;    chp->mono_stereo = ((define_sound_p->SoundFlags & Stereo)) ? 2 : 1;    switch (define_sound_p->SoundFlags & D44KH) {    case D5_5KH:        chp->dsp_speed = 5512;        break;    case D11KH:        chp->dsp_speed = 11025;        break;    case D22KH:        chp->dsp_speed = 22050;        break;    case D44KH:        chp->dsp_speed = 44100;        break;    };    length = define_sound_p->SoundSampleCount * (chp->sample_size/8) * chp->mono_stereo + BUF_LENGTH*2 /*XXX*/;    p = calloc(1,sizeof(struct pcm_block) - BUF_LENGTH + length);    prvp->downchannel_p = p;    p->upchannel_p = prvp;    p->channel_p = chp;    switch (define_sound_p->SoundFlags >> 4) {    case 2: // MP3        InitMP3(&(chp->mp));        ret = decodeMP3(&(chp->mp),define_sound_p->SoundData+2/*XXX*/,define_sound_p->SoundLength,p->data,length,&size);        p->length = p->length + size;        while(ret == MP3_OK) {            ret = decodeMP3(&(chp->mp),NULL,0,p->data+p->length,BUF_LENGTH,&size);            p->length = p->length + size;            if (p->length > length) {                printf("p->length %d, length %d\n", p->length, length);            };            assert(p->length <= length);        }        printf("ret = %d\n",ret);        break;    }    assert(pthread_mutex_unlock(&player_p->pcm_block_mutex) == 0);    //    printf("snd_define_create unlock \n");};

⌨️ 快捷键说明

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