ReadSWF_2Dlg.cpp
资源名称:ReadSWF_5.zip [点击查看]
上传用户:qzjinhui
上传日期:2020-10-10
资源大小:5260k
文件大小:12k
源码类别:
语音压缩
开发平台:
Visual C++
- // ReadSWF_2Dlg.cpp : implementation file
- //
- #include "stdafx.h"
- #include "ReadSWF_2.h"
- #include "ReadSWF_2Dlg.h"
- /*--文件缓冲区写入操作--*/
- #define REMAIN_BITS_CLEAR()
- {
- RunBits=0;
- Code=0;
- }
- #define UI_TO_SI(SI,UI,shiftbits)
- {
- SI=UI<<shiftbits;
- SI=SI>>shiftbits;
- }
- DWORD MaskCode[33]={0x00000000,0x00000001,0x00000003,0x00000007,0x0000000f,
- 0x0000001f,0x0000003f,0x0000007f,0x000000ff,
- 0x000001ff,0x000003ff,0x000007ff,0x00000fff,
- 0x00001fff,0x00003fff,0x00007fff,0x0000ffff,
- 0x0001ffff,0x0003ffff,0x0007ffff,0x000fffff,
- 0x001fffff,0x003fffff,0x007fffff,0x00ffffff,
- 0x01ffffff,0x03ffffff,0x07ffffff,0x0fffffff,
- 0x1fffffff,0x3fffffff,0x7fffffff,0xffffffff };//屏蔽码
- FILE * fin;
- //char Cache[8192];//8k文件缓冲区
- U8 * Cache;
- int pCache=0;
- int RunBits=0;//一个字节中剩余的bit数量
- int Code=0;//一个字节中剩余的RunBits个bit的值
- int tag_type;
- int tag_length;
- //知道文件的大小;
- #define READ_IN_CACHE()
- {
- fread(Cache,48418,1,fin);
- pCache=0;
- }
- #define GET_DWORD_FROM_CACHE(val,buff)
- {
- Read_From_Cache(4,buff);
- val=buff[3]<<24 | buff[2]<<16 | buff[1]<<8 | buff[0];
- }
- #define GET_WORD_FROM_CACHE(val,buff)
- {
- Read_From_Cache(2,buff);
- val=buff[1]<<8 | buff[0];
- }
- #define GET_BYTE_FROM_CACHE(val,buff)
- {
- Read_From_Cache(1,buff);
- val=buff[0];
- }
- #ifdef _DEBUG
- #define new DEBUG_NEW
- #undef THIS_FILE
- static char THIS_FILE[] = __FILE__;
- #endif
- /////////////////////////////////////////////////////////////////////////////
- // CAboutDlg dialog used for App About
- class CAboutDlg : public CDialog
- {
- public:
- CAboutDlg();
- // Dialog Data
- //{{AFX_DATA(CAboutDlg)
- enum { IDD = IDD_ABOUTBOX };
- //}}AFX_DATA
- // ClassWizard generated virtual function overrides
- //{{AFX_VIRTUAL(CAboutDlg)
- protected:
- virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
- //}}AFX_VIRTUAL
- // Implementation
- protected:
- //{{AFX_MSG(CAboutDlg)
- //}}AFX_MSG
- DECLARE_MESSAGE_MAP()
- };
- CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
- {
- //{{AFX_DATA_INIT(CAboutDlg)
- //}}AFX_DATA_INIT
- }
- void CAboutDlg::DoDataExchange(CDataExchange* pDX)
- {
- CDialog::DoDataExchange(pDX);
- //{{AFX_DATA_MAP(CAboutDlg)
- //}}AFX_DATA_MAP
- }
- BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
- //{{AFX_MSG_MAP(CAboutDlg)
- // No message handlers
- //}}AFX_MSG_MAP
- END_MESSAGE_MAP()
- /////////////////////////////////////////////////////////////////////////////
- // CReadSWF_2Dlg dialog
- CReadSWF_2Dlg::CReadSWF_2Dlg(CWnd* pParent /*=NULL*/)
- : CDialog(CReadSWF_2Dlg::IDD, pParent)
- {
- //{{AFX_DATA_INIT(CReadSWF_2Dlg)
- m_SWFFile = _T("");
- //}}AFX_DATA_INIT
- // Note that LoadIcon does not require a subsequent DestroyIcon in Win32
- m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
- m_SWFFileName = "";
- }
- void CReadSWF_2Dlg::DoDataExchange(CDataExchange* pDX)
- {
- CDialog::DoDataExchange(pDX);
- //{{AFX_DATA_MAP(CReadSWF_2Dlg)
- DDX_Text(pDX, IDC_EDIT1, m_SWFFile);
- //}}AFX_DATA_MAP
- }
- BEGIN_MESSAGE_MAP(CReadSWF_2Dlg, CDialog)
- //{{AFX_MSG_MAP(CReadSWF_2Dlg)
- ON_WM_SYSCOMMAND()
- ON_WM_PAINT()
- ON_WM_QUERYDRAGICON()
- ON_BN_CLICKED(IDPLAY, OnPlay)
- ON_BN_CLICKED(IDC_BUTTON1, OnOpenFile)
- //}}AFX_MSG_MAP
- END_MESSAGE_MAP()
- /////////////////////////////////////////////////////////////////////////////
- // CReadSWF_2Dlg message handlers
- DWORD CReadSWF_2Dlg::Get_Bit_From_Cache(int n)
- {
- DWORD Val;
- int cnt,bytes;
- int left_bits;
- BYTE buff[1];
- if(RunBits<n)
- {
- bytes=((n - RunBits - 1)>>3)+1;
- cnt = 0;
- while(cnt<bytes)
- {
- Read_From_Cache(1,buff);
- Code=Code<<8 |buff[0];
- RunBits+=8;
- cnt++;
- }
- }
- left_bits=(RunBits)-n;
- Val=((Code)>>left_bits);
- RunBits=left_bits;
- Code=Code&MaskCode[RunBits];
- return Val;
- }
- BOOL CReadSWF_2Dlg::OnInitDialog()
- {
- CDialog::OnInitDialog();
- // Add "About..." menu item to system menu.
- // IDM_ABOUTBOX must be in the system command range.
- ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
- ASSERT(IDM_ABOUTBOX < 0xF000);
- CMenu* pSysMenu = GetSystemMenu(FALSE);
- if (pSysMenu != NULL)
- {
- CString strAboutMenu;
- strAboutMenu.LoadString(IDS_ABOUTBOX);
- if (!strAboutMenu.IsEmpty())
- {
- pSysMenu->AppendMenu(MF_SEPARATOR);
- pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
- }
- }
- // Set the icon for this dialog. The framework does this automatically
- // when the application's main window is not a dialog
- SetIcon(m_hIcon, TRUE); // Set big icon
- SetIcon(m_hIcon, FALSE); // Set small icon
- // TODO: Add extra initialization here
- return TRUE; // return TRUE unless you set the focus to a control
- }
- void CReadSWF_2Dlg::OnSysCommand(UINT nID, LPARAM lParam)
- {
- if ((nID & 0xFFF0) == IDM_ABOUTBOX)
- {
- CAboutDlg dlgAbout;
- dlgAbout.DoModal();
- }
- else
- {
- CDialog::OnSysCommand(nID, lParam);
- }
- }
- // If you add a minimize button to your dialog, you will need the code below
- // to draw the icon. For MFC applications using the document/view model,
- // this is automatically done for you by the framework.
- void CReadSWF_2Dlg::OnPaint()
- {
- if (IsIconic())
- {
- CPaintDC dc(this); // device context for painting
- SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
- // Center icon in client rectangle
- int cxIcon = GetSystemMetrics(SM_CXICON);
- int cyIcon = GetSystemMetrics(SM_CYICON);
- CRect rect;
- GetClientRect(&rect);
- int x = (rect.Width() - cxIcon + 1) / 2;
- int y = (rect.Height() - cyIcon + 1) / 2;
- // Draw the icon
- dc.DrawIcon(x, y, m_hIcon);
- }
- else
- {
- CDialog::OnPaint();
- }
- }
- // The system calls this to obtain the cursor to display while the user drags
- // the minimized window.
- HCURSOR CReadSWF_2Dlg::OnQueryDragIcon()
- {
- return (HCURSOR) m_hIcon;
- }
- void CReadSWF_2Dlg::OnPlay()
- {
- // TODO: Add your control notification handler code here
- //这里如果碰到的"标签"就进来;
- FILE* file;
- if(m_SWFFileName == "")
- {
- ::MessageBox(NULL,"请选择文件","error",MB_ICONSTOP);
- return;
- }
- file = fopen(m_SWFFileName,"rb");//打开文件;
- if(file == 0)
- {
- ::MessageBox(NULL,"文件不存在","error",MB_ICONERROR);
- return;
- }
- SWF_Decoder(file);
- }
- NativeSoundMix theSoundMix;
- void CReadSWF_2Dlg::OnOpenFile()
- {
- // TODO: Add your control notification handler code here
- static char BASED_CODE szFilter[] = "swf Files (*.swf)|*.swf|All Files (*.*)|*.*||";
- CFileDialog m_dlg(TRUE,"swf","*.swf",OFN_FILEMUSTEXIST|OFN_HIDEREADONLY,
- szFilter,this);
- //extern CString m_SFileName;
- if(m_dlg.DoModal() == IDOK)
- {
- m_SWFFile = m_dlg.GetPathName();
- m_SWFFileName = m_SWFFile;
- UpdateData(false);
- }
- else
- return;
- theSoundMix.Construct();//下面就把一些初始化的工作给做了
- }
- void CReadSWF_2Dlg::Read_From_Cache(DWORD readlen,BYTE * buff)
- {
- memcpy(buff,Cache+pCache,readlen);//需要的就是这个值;pCache
- pCache+=readlen;
- #if 0
- DWORD length;
- DWORD num;
- int pbuff;
- if(pCache==8192) READ_IN_CACHE();//如果满足了
- if(readlen<=(8192-pCache))
- {
- memcpy(buff,Cache+pCache,readlen);//需要的就是这个值;pCache
- pCache+=readlen;
- }
- else
- {
- length=readlen;
- pbuff=0;
- while(length>(8192-pCache))
- {
- num=8192-pCache;
- memcpy(buff+pbuff,Cache+pCache,num);
- pbuff+=num;
- length-=num;
- READ_IN_CACHE();
- }
- memcpy(buff+pbuff,Cache+pCache,length);
- pCache+=length;
- }
- #endif
- }
- void CReadSWF_2Dlg::Get_RECT_From_Cache(RECT_1 * pRect)
- {
- int nbits;
- int shiftbits;
- nbits=Get_Bit_From_Cache(5);//调用了函数;
- shiftbits=32-nbits;
- UI_TO_SI(pRect->Xmin,Get_Bit_From_Cache(nbits),shiftbits);
- UI_TO_SI(pRect->Xmax,Get_Bit_From_Cache(nbits),shiftbits);
- UI_TO_SI(pRect->Ymin,Get_Bit_From_Cache(nbits),shiftbits);
- UI_TO_SI(pRect->Ymax,Get_Bit_From_Cache(nbits),shiftbits);
- REMAIN_BITS_CLEAR();
- }
- void CReadSWF_2Dlg::SWF_Decoder(FILE *file)
- {
- BYTE buff[4];
- BYTE Signature[3];
- BYTE Version;
- DWORD FileLength;
- RECT_1 FrameSize;
- WORD FrameRate;
- WORD FrameCount;
- int hScale,vScale;
- WORD TagCodeAndLength;
- int tmp;
- //int tmp_left;
- //READ_IN_CACHE();
- fin=file;
- Cache = new U8[81920];//这个是开辟内存;
- fread(Cache,48418,1,file);
- pCache=0;
- //文件头解码
- Read_From_Cache(4,buff);
- Signature[0]=buff[0];
- Signature[1]=buff[1];
- Signature[2]=buff[2];
- Version=buff[3];
- GET_DWORD_FROM_CACHE(FileLength,buff);
- Get_RECT_From_Cache(&FrameSize);
- GET_WORD_FROM_CACHE(FrameRate,buff);
- GET_WORD_FROM_CACHE(FrameCount,buff);
- //下面就是开始解码;
- GET_WORD_FROM_CACHE(TagCodeAndLength,buff);//
- tag_type=(TagCodeAndLength&0XFFC0)>>6;//这个是活的标签
- tag_length=TagCodeAndLength&0X003F;//这个是活的文件的下面文件的长度
- if(tag_length==0x3f) GET_DWORD_FROM_CACHE(tag_length,buff);
- //pCache += tag_length;
- #if 0
- if (Version == Version)
- {
- }
- #endif
- while(tag_type)//这样的话就可以读取所有的"标签了"
- {
- #if 1
- switch(tag_type)
- {
- case DEFINESOUND:
- Define_Sound();
- break;
- case STARTSOUND:
- Start_Sound();
- break;
- default:
- #endif
- {
- BYTE* malloc_buff;
- malloc_buff = (BYTE *)malloc(tag_length * sizeof(BYTE));
- Read_From_Cache(tag_length,malloc_buff);//
- }
- }
- GET_WORD_FROM_CACHE(TagCodeAndLength,buff);//
- tag_type=(TagCodeAndLength&0XFFC0)>>6;//这个是活的标签
- tag_length=TagCodeAndLength&0X003F;//这个是活的文件的下面文件的长度
- if(tag_length==0x3f) GET_DWORD_FROM_CACHE(tag_length,buff);
- //开辟内存读取;
- #if 0
- tmp = pCache + tag_length;
- if(tmp >= 8192)
- {
- READ_IN_CACHE();
- pCache = tmp - 8192;//
- }
- else
- pCache += tag_length;//如果这个值超过了一定的数据之后就要注意了;
- #endif
- }
- }
- void CReadSWF_2Dlg::Start_Sound()
- {
- U16 tag;
- BYTE tmp_buff_byte[4];
- GET_WORD_FROM_CACHE(tag,tmp_buff_byte);
- //GET_BYTE_FROM_CACHE(tag,tmp_buff_byte);
- //GET_BYTE_FROM_CACHE(tag,tmp_buff_byte);
- CSoundChannel* channel = new CSoundChannel();//
- if ( !channel ) return;
- channel->AddRef();
- channel->sound = &sound;
- channel->tag = (U32) this;
- GetSoundInfo(channel);//GetSoundInfo
- theSoundMix.AddSound(channel);
- channel->Release();
- //GET_BYTE_FROM_CACHE(tag,tmp_buff_byte);
- //GET_BYTE_FROM_CACHE(tag,tmp_buff_byte);
- //pCache += 1;
- }
- void CReadSWF_2Dlg::GetSoundInfo(CSoundChannel* c)
- {
- int code;
- BYTE tmp_buffer_byte[4];
- GET_BYTE_FROM_CACHE(code,tmp_buffer_byte);
- // Fill in the info
- c->syncFlags = code>>4;
- if ( code & soundHasInPoint )//0000 0001
- GET_DWORD_FROM_CACHE(c->inPoint44,tmp_buffer_byte);
- if ( code & soundHasOutPoint )//0000 0010
- GET_DWORD_FROM_CACHE(c->outPoint44,tmp_buffer_byte);
- if ( code & soundHasLoops )//0000 0100
- GET_WORD_FROM_CACHE(c->loops,tmp_buffer_byte);
- if ( code & soundHasEnvelope )//0000 1000
- {
- GET_BYTE_FROM_CACHE(c->envelope.nPoints,tmp_buffer_byte);
- for ( int i = 0; i < c->envelope.nPoints; i++ )
- {
- DWORD tmp_DWORD;
- WORD tmp_WORD;
- GET_DWORD_FROM_CACHE(tmp_DWORD,tmp_buffer_byte);
- c->envelope.points[i].mark44 = tmp_DWORD;
- GET_WORD_FROM_CACHE(tmp_WORD,tmp_buffer_byte);
- c->envelope.points[i].level0 = tmp_WORD;
- GET_WORD_FROM_CACHE(tmp_WORD,tmp_buffer_byte);
- c->envelope.points[i].level1 = tmp_WORD;
- }
- }
- }
- void CReadSWF_2Dlg::Define_Sound()
- {
- BYTE tmp_buff_byte[4];
- U16 tag;
- GET_WORD_FROM_CACHE(tag,tmp_buff_byte);
- GET_BYTE_FROM_CACHE(sound.format,tmp_buff_byte);
- GET_DWORD_FROM_CACHE(sound.nSamples,tmp_buff_byte);
- switch(sound.CompressFormat())
- {
- case sndCompressNone:
- case sndCompressNoneI:
- case sndCompressADPCM:
- sound.delay = 0;
- break;
- case sndCompressMP3:
- // get the compression delay in samples
- //sound.delay = GetWord();//这个是在数据中获得延迟
- GET_WORD_FROM_CACHE(sound.delay,tmp_buff_byte);
- break;
- // We don't support the compression format
- default:
- break;
- }
- sound.samples = Cache+pCache;//这个事样本刚开始的地方;
- sound.dataLen = 48372;
- BYTE *tmp_buffer;
- tmp_buffer = (BYTE *)malloc(sizeof(BYTE)*48372);
- Read_From_Cache(sound.dataLen,tmp_buffer);//读取一些数据;
- //pCache += (tag_length-1-2-4);
- }
English
