ReadSWF_2Dlg.cpp
上传用户:qzjinhui
上传日期:2020-10-10
资源大小:5260k
文件大小:12k
源码类别:

语音压缩

开发平台:

Visual C++

  1. // ReadSWF_2Dlg.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "ReadSWF_2.h"
  5. #include "ReadSWF_2Dlg.h"
  6. /*--文件缓冲区写入操作--*/
  7. #define REMAIN_BITS_CLEAR()
  8. {
  9. RunBits=0;
  10. Code=0;
  11. }
  12. #define UI_TO_SI(SI,UI,shiftbits) 
  13. {
  14. SI=UI<<shiftbits;
  15. SI=SI>>shiftbits;
  16. }
  17. DWORD MaskCode[33]={0x00000000,0x00000001,0x00000003,0x00000007,0x0000000f,
  18. 0x0000001f,0x0000003f,0x0000007f,0x000000ff,
  19. 0x000001ff,0x000003ff,0x000007ff,0x00000fff,
  20. 0x00001fff,0x00003fff,0x00007fff,0x0000ffff,
  21. 0x0001ffff,0x0003ffff,0x0007ffff,0x000fffff,
  22. 0x001fffff,0x003fffff,0x007fffff,0x00ffffff,
  23. 0x01ffffff,0x03ffffff,0x07ffffff,0x0fffffff,
  24.                 0x1fffffff,0x3fffffff,0x7fffffff,0xffffffff };//屏蔽码
  25. FILE * fin;
  26. //char Cache[8192];//8k文件缓冲区
  27.  U8 * Cache;
  28. int pCache=0;
  29. int RunBits=0;//一个字节中剩余的bit数量
  30. int Code=0;//一个字节中剩余的RunBits个bit的值
  31. int tag_type;
  32. int tag_length;
  33. //知道文件的大小;
  34. #define READ_IN_CACHE()
  35. {
  36. fread(Cache,48418,1,fin);
  37. pCache=0;
  38. }
  39. #define GET_DWORD_FROM_CACHE(val,buff)
  40. {
  41. Read_From_Cache(4,buff);
  42. val=buff[3]<<24 | buff[2]<<16 | buff[1]<<8 | buff[0];
  43. }
  44. #define GET_WORD_FROM_CACHE(val,buff)
  45. {
  46. Read_From_Cache(2,buff);
  47. val=buff[1]<<8 | buff[0];
  48. }
  49. #define GET_BYTE_FROM_CACHE(val,buff)
  50. {
  51. Read_From_Cache(1,buff);
  52. val=buff[0];
  53. }
  54. #ifdef _DEBUG
  55. #define new DEBUG_NEW
  56. #undef THIS_FILE
  57. static char THIS_FILE[] = __FILE__;
  58. #endif
  59. /////////////////////////////////////////////////////////////////////////////
  60. // CAboutDlg dialog used for App About
  61. class CAboutDlg : public CDialog
  62. {
  63. public:
  64. CAboutDlg();
  65. // Dialog Data
  66. //{{AFX_DATA(CAboutDlg)
  67. enum { IDD = IDD_ABOUTBOX };
  68. //}}AFX_DATA
  69. // ClassWizard generated virtual function overrides
  70. //{{AFX_VIRTUAL(CAboutDlg)
  71. protected:
  72. virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
  73. //}}AFX_VIRTUAL
  74. // Implementation
  75. protected:
  76. //{{AFX_MSG(CAboutDlg)
  77. //}}AFX_MSG
  78. DECLARE_MESSAGE_MAP()
  79. };
  80. CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
  81. {
  82. //{{AFX_DATA_INIT(CAboutDlg)
  83. //}}AFX_DATA_INIT
  84. }
  85. void CAboutDlg::DoDataExchange(CDataExchange* pDX)
  86. {
  87. CDialog::DoDataExchange(pDX);
  88. //{{AFX_DATA_MAP(CAboutDlg)
  89. //}}AFX_DATA_MAP
  90. }
  91. BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
  92. //{{AFX_MSG_MAP(CAboutDlg)
  93. // No message handlers
  94. //}}AFX_MSG_MAP
  95. END_MESSAGE_MAP()
  96. /////////////////////////////////////////////////////////////////////////////
  97. // CReadSWF_2Dlg dialog
  98. CReadSWF_2Dlg::CReadSWF_2Dlg(CWnd* pParent /*=NULL*/)
  99. : CDialog(CReadSWF_2Dlg::IDD, pParent)
  100. {
  101. //{{AFX_DATA_INIT(CReadSWF_2Dlg)
  102. m_SWFFile = _T("");
  103. //}}AFX_DATA_INIT
  104. // Note that LoadIcon does not require a subsequent DestroyIcon in Win32
  105. m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  106. m_SWFFileName = "";
  107. }
  108. void CReadSWF_2Dlg::DoDataExchange(CDataExchange* pDX)
  109. {
  110. CDialog::DoDataExchange(pDX);
  111. //{{AFX_DATA_MAP(CReadSWF_2Dlg)
  112. DDX_Text(pDX, IDC_EDIT1, m_SWFFile);
  113. //}}AFX_DATA_MAP
  114. }
  115. BEGIN_MESSAGE_MAP(CReadSWF_2Dlg, CDialog)
  116. //{{AFX_MSG_MAP(CReadSWF_2Dlg)
  117. ON_WM_SYSCOMMAND()
  118. ON_WM_PAINT()
  119. ON_WM_QUERYDRAGICON()
  120. ON_BN_CLICKED(IDPLAY, OnPlay)
  121. ON_BN_CLICKED(IDC_BUTTON1, OnOpenFile)
  122. //}}AFX_MSG_MAP
  123. END_MESSAGE_MAP()
  124. /////////////////////////////////////////////////////////////////////////////
  125. // CReadSWF_2Dlg message handlers
  126. DWORD CReadSWF_2Dlg::Get_Bit_From_Cache(int n)
  127. {
  128. DWORD Val;
  129. int cnt,bytes;
  130. int left_bits;
  131. BYTE buff[1];
  132. if(RunBits<n)
  133. {
  134. bytes=((n - RunBits - 1)>>3)+1;
  135. cnt = 0;
  136. while(cnt<bytes)
  137. {
  138. Read_From_Cache(1,buff);
  139. Code=Code<<8 |buff[0];
  140. RunBits+=8;
  141. cnt++;
  142. }
  143. }
  144. left_bits=(RunBits)-n;
  145. Val=((Code)>>left_bits);
  146. RunBits=left_bits;
  147. Code=Code&MaskCode[RunBits];
  148. return Val;
  149. }
  150. BOOL CReadSWF_2Dlg::OnInitDialog()
  151. {
  152. CDialog::OnInitDialog();
  153. // Add "About..." menu item to system menu.
  154. // IDM_ABOUTBOX must be in the system command range.
  155. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
  156. ASSERT(IDM_ABOUTBOX < 0xF000);
  157. CMenu* pSysMenu = GetSystemMenu(FALSE);
  158. if (pSysMenu != NULL)
  159. {
  160. CString strAboutMenu;
  161. strAboutMenu.LoadString(IDS_ABOUTBOX);
  162. if (!strAboutMenu.IsEmpty())
  163. {
  164. pSysMenu->AppendMenu(MF_SEPARATOR);
  165. pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
  166. }
  167. }
  168. // Set the icon for this dialog.  The framework does this automatically
  169. //  when the application's main window is not a dialog
  170. SetIcon(m_hIcon, TRUE); // Set big icon
  171. SetIcon(m_hIcon, FALSE); // Set small icon
  172. // TODO: Add extra initialization here
  173. return TRUE;  // return TRUE  unless you set the focus to a control
  174. }
  175. void CReadSWF_2Dlg::OnSysCommand(UINT nID, LPARAM lParam)
  176. {
  177. if ((nID & 0xFFF0) == IDM_ABOUTBOX)
  178. {
  179. CAboutDlg dlgAbout;
  180. dlgAbout.DoModal();
  181. }
  182. else
  183. {
  184. CDialog::OnSysCommand(nID, lParam);
  185. }
  186. }
  187. // If you add a minimize button to your dialog, you will need the code below
  188. //  to draw the icon.  For MFC applications using the document/view model,
  189. //  this is automatically done for you by the framework.
  190. void CReadSWF_2Dlg::OnPaint() 
  191. {
  192. if (IsIconic())
  193. {
  194. CPaintDC dc(this); // device context for painting
  195. SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
  196. // Center icon in client rectangle
  197. int cxIcon = GetSystemMetrics(SM_CXICON);
  198. int cyIcon = GetSystemMetrics(SM_CYICON);
  199. CRect rect;
  200. GetClientRect(&rect);
  201. int x = (rect.Width() - cxIcon + 1) / 2;
  202. int y = (rect.Height() - cyIcon + 1) / 2;
  203. // Draw the icon
  204. dc.DrawIcon(x, y, m_hIcon);
  205. }
  206. else
  207. {
  208. CDialog::OnPaint();
  209. }
  210. }
  211. // The system calls this to obtain the cursor to display while the user drags
  212. //  the minimized window.
  213. HCURSOR CReadSWF_2Dlg::OnQueryDragIcon()
  214. {
  215. return (HCURSOR) m_hIcon;
  216. }
  217. void CReadSWF_2Dlg::OnPlay() 
  218. {
  219. // TODO: Add your control notification handler code here
  220. //这里如果碰到的"标签"就进来;
  221. FILE* file;
  222. if(m_SWFFileName == "")
  223. {
  224. ::MessageBox(NULL,"请选择文件","error",MB_ICONSTOP);
  225. return;
  226. }
  227. file = fopen(m_SWFFileName,"rb");//打开文件;
  228. if(file == 0)
  229. {
  230. ::MessageBox(NULL,"文件不存在","error",MB_ICONERROR);
  231. return;
  232. }
  233. SWF_Decoder(file);
  234. }
  235. NativeSoundMix theSoundMix;
  236. void CReadSWF_2Dlg::OnOpenFile() 
  237. {
  238. // TODO: Add your control notification handler code here
  239. static char BASED_CODE szFilter[] = "swf Files (*.swf)|*.swf|All Files (*.*)|*.*||";
  240. CFileDialog m_dlg(TRUE,"swf","*.swf",OFN_FILEMUSTEXIST|OFN_HIDEREADONLY,
  241. szFilter,this);
  242. //extern CString m_SFileName;
  243. if(m_dlg.DoModal() == IDOK)
  244. {
  245. m_SWFFile = m_dlg.GetPathName();
  246. m_SWFFileName = m_SWFFile;
  247. UpdateData(false);
  248. }
  249. else
  250. return;
  251. theSoundMix.Construct();//下面就把一些初始化的工作给做了
  252. }
  253. void CReadSWF_2Dlg::Read_From_Cache(DWORD readlen,BYTE * buff)
  254. {
  255. memcpy(buff,Cache+pCache,readlen);//需要的就是这个值;pCache
  256. pCache+=readlen;
  257. #if 0
  258. DWORD length;
  259. DWORD num;
  260. int pbuff;
  261. if(pCache==8192) READ_IN_CACHE();//如果满足了
  262. if(readlen<=(8192-pCache))
  263. {
  264. memcpy(buff,Cache+pCache,readlen);//需要的就是这个值;pCache
  265. pCache+=readlen;
  266. }
  267. else
  268. {
  269. length=readlen;
  270. pbuff=0;
  271. while(length>(8192-pCache))
  272. {
  273. num=8192-pCache;
  274. memcpy(buff+pbuff,Cache+pCache,num);
  275. pbuff+=num;
  276. length-=num;
  277. READ_IN_CACHE();
  278. }
  279. memcpy(buff+pbuff,Cache+pCache,length);
  280. pCache+=length;
  281. }
  282. #endif
  283. }
  284. void CReadSWF_2Dlg::Get_RECT_From_Cache(RECT_1 * pRect)
  285. {
  286. int nbits;
  287. int shiftbits;
  288. nbits=Get_Bit_From_Cache(5);//调用了函数;
  289. shiftbits=32-nbits;
  290. UI_TO_SI(pRect->Xmin,Get_Bit_From_Cache(nbits),shiftbits);
  291. UI_TO_SI(pRect->Xmax,Get_Bit_From_Cache(nbits),shiftbits);
  292. UI_TO_SI(pRect->Ymin,Get_Bit_From_Cache(nbits),shiftbits);
  293. UI_TO_SI(pRect->Ymax,Get_Bit_From_Cache(nbits),shiftbits);
  294. REMAIN_BITS_CLEAR();
  295. }
  296. void CReadSWF_2Dlg::SWF_Decoder(FILE *file)
  297. {
  298. BYTE buff[4];
  299. BYTE Signature[3];
  300. BYTE Version;
  301. DWORD FileLength;
  302. RECT_1 FrameSize;
  303. WORD FrameRate;
  304. WORD FrameCount;
  305. int hScale,vScale;
  306. WORD TagCodeAndLength;
  307. int tmp;
  308. //int tmp_left;
  309. //READ_IN_CACHE();
  310. fin=file;
  311. Cache = new U8[81920];//这个是开辟内存;
  312. fread(Cache,48418,1,file);
  313. pCache=0;
  314. //文件头解码
  315. Read_From_Cache(4,buff);
  316. Signature[0]=buff[0];
  317. Signature[1]=buff[1];
  318. Signature[2]=buff[2];
  319. Version=buff[3];
  320. GET_DWORD_FROM_CACHE(FileLength,buff);
  321. Get_RECT_From_Cache(&FrameSize);
  322. GET_WORD_FROM_CACHE(FrameRate,buff);
  323. GET_WORD_FROM_CACHE(FrameCount,buff);
  324. //下面就是开始解码;
  325. GET_WORD_FROM_CACHE(TagCodeAndLength,buff);//
  326. tag_type=(TagCodeAndLength&0XFFC0)>>6;//这个是活的标签
  327. tag_length=TagCodeAndLength&0X003F;//这个是活的文件的下面文件的长度
  328. if(tag_length==0x3f) GET_DWORD_FROM_CACHE(tag_length,buff);
  329. //pCache += tag_length;
  330. #if 0
  331. if (Version == Version)
  332. {
  333. }
  334. #endif
  335. while(tag_type)//这样的话就可以读取所有的"标签了"
  336. {
  337. #if 1
  338. switch(tag_type) 
  339. {
  340. case DEFINESOUND:
  341. Define_Sound();
  342. break;
  343. case STARTSOUND:
  344. Start_Sound();
  345. break;
  346. default:
  347. #endif 
  348. {
  349. BYTE* malloc_buff;
  350. malloc_buff = (BYTE *)malloc(tag_length * sizeof(BYTE));
  351.              Read_From_Cache(tag_length,malloc_buff);//
  352. }
  353. }
  354.         
  355. GET_WORD_FROM_CACHE(TagCodeAndLength,buff);//
  356. tag_type=(TagCodeAndLength&0XFFC0)>>6;//这个是活的标签
  357. tag_length=TagCodeAndLength&0X003F;//这个是活的文件的下面文件的长度
  358. if(tag_length==0x3f) GET_DWORD_FROM_CACHE(tag_length,buff);
  359. //开辟内存读取;
  360. #if 0
  361. tmp  = pCache + tag_length;
  362. if(tmp >= 8192)
  363. {
  364.             READ_IN_CACHE();
  365. pCache = tmp - 8192;//
  366. }
  367. else
  368.     pCache += tag_length;//如果这个值超过了一定的数据之后就要注意了;
  369. #endif
  370. }
  371. }
  372. void CReadSWF_2Dlg::Start_Sound()
  373. {
  374. U16 tag;
  375. BYTE tmp_buff_byte[4];
  376. GET_WORD_FROM_CACHE(tag,tmp_buff_byte);
  377. //GET_BYTE_FROM_CACHE(tag,tmp_buff_byte);
  378. //GET_BYTE_FROM_CACHE(tag,tmp_buff_byte);
  379. CSoundChannel* channel = new CSoundChannel();//
  380. if ( !channel ) return;
  381. channel->AddRef();
  382. channel->sound = &sound;
  383. channel->tag = (U32) this;
  384. GetSoundInfo(channel);//GetSoundInfo
  385. theSoundMix.AddSound(channel);
  386. channel->Release();
  387. //GET_BYTE_FROM_CACHE(tag,tmp_buff_byte);
  388. //GET_BYTE_FROM_CACHE(tag,tmp_buff_byte);
  389. //pCache += 1;
  390. }
  391. void CReadSWF_2Dlg::GetSoundInfo(CSoundChannel* c)
  392. {
  393. int code;
  394. BYTE tmp_buffer_byte[4];
  395. GET_BYTE_FROM_CACHE(code,tmp_buffer_byte);
  396.   
  397. // Fill in the info
  398. c->syncFlags = code>>4;
  399. if ( code & soundHasInPoint )//0000 0001
  400. GET_DWORD_FROM_CACHE(c->inPoint44,tmp_buffer_byte);
  401. if ( code & soundHasOutPoint )//0000 0010 
  402. GET_DWORD_FROM_CACHE(c->outPoint44,tmp_buffer_byte);
  403. if ( code & soundHasLoops )//0000 0100
  404. GET_WORD_FROM_CACHE(c->loops,tmp_buffer_byte);
  405. if ( code & soundHasEnvelope )//0000 1000 
  406. {
  407. GET_BYTE_FROM_CACHE(c->envelope.nPoints,tmp_buffer_byte);
  408. for ( int i = 0; i < c->envelope.nPoints; i++ ) 
  409. {
  410. DWORD tmp_DWORD;
  411. WORD tmp_WORD;
  412.             GET_DWORD_FROM_CACHE(tmp_DWORD,tmp_buffer_byte);
  413. c->envelope.points[i].mark44 = tmp_DWORD;
  414. GET_WORD_FROM_CACHE(tmp_WORD,tmp_buffer_byte);
  415. c->envelope.points[i].level0 = tmp_WORD;
  416. GET_WORD_FROM_CACHE(tmp_WORD,tmp_buffer_byte);
  417. c->envelope.points[i].level1 = tmp_WORD;
  418. }
  419. }
  420. }
  421. void CReadSWF_2Dlg::Define_Sound()
  422. {
  423. BYTE tmp_buff_byte[4];
  424. U16 tag;
  425. GET_WORD_FROM_CACHE(tag,tmp_buff_byte);
  426.     GET_BYTE_FROM_CACHE(sound.format,tmp_buff_byte);
  427. GET_DWORD_FROM_CACHE(sound.nSamples,tmp_buff_byte);
  428.     switch(sound.CompressFormat()) 
  429. {
  430. case sndCompressNone:
  431. case sndCompressNoneI:
  432. case sndCompressADPCM:
  433. sound.delay = 0;
  434. break;
  435. case sndCompressMP3:
  436. // get the compression delay in samples
  437. //sound.delay = GetWord();//这个是在数据中获得延迟
  438. GET_WORD_FROM_CACHE(sound.delay,tmp_buff_byte);
  439. break;
  440. // We don't support the compression format
  441. default:
  442. break;
  443.     }
  444. sound.samples = Cache+pCache;//这个事样本刚开始的地方;
  445. sound.dataLen = 48372;
  446.     BYTE *tmp_buffer;
  447. tmp_buffer = (BYTE *)malloc(sizeof(BYTE)*48372);
  448. Read_From_Cache(sound.dataLen,tmp_buffer);//读取一些数据;
  449. //pCache += (tag_length-1-2-4);
  450. }