📄 sound_decomp.c.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 + -