ceglue.cpp
上传用户:tuheem
上传日期:2007-05-01
资源大小:21889k
文件大小:8k
源码类别:

多媒体编程

开发平台:

Visual C++

  1. /*
  2.  *  @(#) ceglue.cpp, last edit: 4/9/1998
  3.  *  @(#) Copyright (C) 1998 Syntrillium Software (www.syntrillium.com)
  4.  *
  5.  *  This program is free software; you can redistribute it and/or modify
  6.  *  it under the terms of the GNU General Public License as published by
  7.  *  the Free Software Foundation; either version 2 of the License, or
  8.  *  (at your option) any later version.
  9.  *
  10.  *  This program is distributed in the hope that it will be useful,
  11.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13.  *  GNU General Public License for more details.
  14.  *
  15.  *  You should have received a copy of the GNU General Public License
  16.  *  along with this program; if not, write to the Free Software
  17.  *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  18.  *
  19.  * Basically we are taking what we need from mp2win.cpp and doing a 
  20.  * non-independent-thread (non Windows GUI) version of maplay.
  21.  *
  22.  *
  23.  */
  24. #define  STRICT
  25. #include <windows.h>
  26. #include <commctrl.h>
  27. #include <commdlg.h>
  28. #include <shlobj.h>
  29. #include "all.h"
  30. #include "crc.h"
  31. #include "ibitstr.h"
  32. #include "header.h"
  33. #include "args.h"
  34. #include "subband.h"
  35. #include "sublay1.h"
  36. #include "sublay2.h"
  37. #include "synfilt.h"
  38. #include "ibitstr.h"
  39. #include "obuffer.h"
  40. #include "layer3.h"
  41. extern "C"
  42. {
  43. #include "ceglue.h"
  44. }
  45. #include <math.h>
  46. #define NUM_RFL_ENTRIES 4
  47. #define REMOTE_THRESH   5
  48. BOOL MPEG = FALSE;
  49. enum e_channels mode = both;
  50. // Dummy CRC pointer
  51. //Crc16 *crc;
  52. SynthesisFilter *filter1 = NULL, *filter2 = NULL;
  53. Obuffer *buffer = NULL;
  54. LayerIII_Decoder *l3decoder = NULL;
  55. enum e_mode actualmode;
  56. uint32 layer;
  57. // These arguments should not change while decoding
  58. Ibitstream *stream = NULL;
  59. Header *header     = NULL;
  60. enum e_channels which_channels;
  61. BOOL bComplete=FALSE;
  62. MPEG_Args _maplay_args;
  63. MPEG_Args *maplay_args = &_maplay_args;
  64. void maplay_Exit(uint32 returncode)
  65. {
  66.   delete buffer;
  67.   buffer = NULL;
  68.   delete filter1;
  69.   filter1 = NULL;
  70.   delete filter2;
  71.   filter2 = NULL;
  72.   delete l3decoder;
  73.   l3decoder = NULL;
  74. }
  75. BOOL CPPMPEG_GetInfo(MPEG_INFO * mpi)
  76. {
  77. if (!MPEG)
  78. return FALSE;
  79. if (!header)
  80. return FALSE;
  81. mpi->iLayer =(int)header->layer();
  82. mpi->iVersion =(int)header->version();
  83. mpi->iStereoMode =(int)header->mode();
  84. mpi->iSamplerate =(int)header->frequency();
  85. mpi->iChannels =(header->mode()==single_channel)?1:2;
  86. mpi->bIsChecksummed =(BOOL)header->checksums();
  87. mpi->bIsCopyrighted =(BOOL)header->copyright();
  88. mpi->bIsOriginal =(BOOL)header->original();
  89. mpi->iBitrateIndex =(int)header->bitrate_index();
  90. mpi->iFrameSize =(int)header->calculate_framesize();
  91. mpi->fLengthInMilliseconds=header->total_ms(stream);
  92. lstrcpy(mpi->szBitrate,header->bitrate_string());
  93. lstrcpy(mpi->szVersion,header->version_string());
  94. return TRUE;
  95. }
  96. // header_copy.total_ms(&stream_copy) in CPPMPEG_GetInfo
  97. BOOL CPPMPEG_Open(LPSTR szName)
  98. {
  99. MPEG = TRUE;
  100. bComplete=FALSE;
  101. real own_scalefactor = 32768.0f;
  102. //args->mutex = CreateMutex(NULL, FALSE, "m");
  103. stream      = new Ibitstream(szName);
  104. header = new Header;
  105.    
  106. /* if (!header->read_header(stream, &crc)){
  107. return FALSE;
  108. }*/
  109. // AND GET THINGS STARTED!
  110. // crc         = NULL;
  111. which_channels = both; // or left, right, downmix
  112. bComplete=FALSE;
  113.    // get info from header of first frame:
  114.    layer = header->layer();
  115.    if ((actualmode=header->mode())== single_channel)
  116.    which_channels = left;
  117.    // create filter(s):
  118.    {
  119.       real scalefactor = own_scalefactor; // insert any scal factor here
  120. filter1 = new SynthesisFilter(0, scalefactor);
  121.    if ((actualmode != single_channel) && (which_channels == both))
  122.    filter2 = new SynthesisFilter(1, scalefactor);
  123.    }
  124.    // set up args for buffer class to use
  125.    maplay_args->MPEGheader=header;
  126.    maplay_args->which_c=which_channels;
  127.    // create buffer, and check to see if created ok:
  128. //   buffer=create_CEP_Obuffer(maplay_args);
  129.    if (buffer == NULL) {
  130. maplay_Exit(0);
  131.       return 1;
  132.    }
  133.   // Layer III : initialize decoder
  134.    if (layer == 3)
  135.       l3decoder = new LayerIII_Decoder(stream, header, filter1,
  136.        filter2, buffer, which_channels);
  137. return TRUE;
  138. }
  139. // Returns number of bytes, or zero for complete
  140. int CPPMPEG_Read(BYTE * pBuffer)
  141. {
  142. bool read_ready = false, write_ready = false;
  143.     int iRead;
  144. if (bComplete)
  145. return 0;
  146. // is there a change in important parameters?
  147. // (bitrate switching is allowed)
  148. if (header->layer() != layer)
  149. {
  150. // layer switching is allowed
  151.   if (header->layer() == 3) {
  152.          l3decoder = new LayerIII_Decoder(stream, header,
  153.             filter1, filter2,
  154.                                           buffer, which_channels);
  155.       } else if (layer == 3) {
  156.        delete l3decoder;
  157.          l3decoder = NULL;
  158.       }
  159. layer = header->layer();
  160.  }
  161.  if (layer != 3) {
  162.     Subband *subbands[32];
  163.     uint32 num_subbands = header->number_of_subbands();
  164.        uint32 i;
  165.        actualmode = header->mode();
  166.  // create subband objects:
  167.  if (layer == 1)
  168.  {
  169. if (actualmode == single_channel)
  170. for (i = 0; i < num_subbands; ++i)
  171.   subbands[i] = new SubbandLayer1(i);
  172. else if (actualmode == joint_stereo) {
  173. for (i = 0; i < header->intensity_stereo_bound(); ++i)
  174.   subbands[i] = new SubbandLayer1Stereo(i);
  175. for (; i < num_subbands; ++i)
  176.   subbands[i] = new SubbandLayer1IntensityStereo(i);
  177. } else {
  178. for (i = 0; i < num_subbands; ++i)
  179.   subbands[i] = new SubbandLayer1Stereo(i);
  180.       }
  181.  } else { // Layer II
  182. if (actualmode == single_channel)
  183. for (i = 0; i < num_subbands; ++i)
  184.       subbands[i] = new SubbandLayer2(i);
  185. else if (actualmode == joint_stereo)
  186. {
  187. for (i = 0; i < header->intensity_stereo_bound(); ++i)
  188.       subbands[i] = new SubbandLayer2Stereo(i);
  189. for (; i < num_subbands; ++i)
  190.     subbands[i] = new SubbandLayer2IntensityStereo(i);
  191. } else {
  192. for (i = 0; i < num_subbands; ++i)
  193.     subbands[i] = new SubbandLayer2Stereo(i);
  194.          }
  195.    }
  196.        // start to read audio data:
  197.     for (i = 0; i < num_subbands; ++i)
  198. //        subbands[i]->read_allocation(stream, header, crc);
  199.  if (layer == 2)
  200. for (i = 0; i < num_subbands; ++i)
  201. //((SubbandLayer2 *)subbands[i])->read_scalefactor_selection(stream,
  202.              //      crc);
  203. /*  if (!crc || header->checksum_ok())
  204.  {
  205. // no checksums or checksum ok, continue reading from stream:
  206. for (i = 0; i < num_subbands; ++i)
  207. subbands[i]->read_scalefactor(stream, header);
  208. do
  209. {
  210. for (i = 0; i < num_subbands; ++i)
  211. read_ready = subbands[i]->read_sampledata(stream);
  212. do
  213. {
  214. for (i = 0; i < num_subbands; ++i)
  215. write_ready = subbands[i]->put_next_sample(which_channels,
  216.                                                            filter1, filter2);
  217. filter1->calculate_pcm_samples(buffer);
  218. if ((which_channels == both) && (actualmode!= single_channel))
  219.                 filter2->calculate_pcm_samples(buffer);
  220. } while (!write_ready);
  221. } while (!read_ready);
  222.       buffer->write_buffer(1);
  223.  } // checksum ok*/
  224.  // Jeff : Don't let user know if crc violated.
  225. //     else
  226. // Sh*t! Wrong crc checksum in frame!
  227. // cerr << "WARNING: frame contains wrong crc checksum! (throwing frame away)n";
  228.        for (i = 0; i < num_subbands; ++i)
  229. delete subbands[i];
  230.     } else {  // Layer III
  231.    l3decoder->decode();
  232.     }
  233. /*   if (!header->read_header(stream, &crc))
  234.    bComplete=TRUE;*/
  235. // BYTE * pBuf=buffer->get_buffer(&iRead);
  236. //    CopyMemory(pBuffer,pBuf,iRead);
  237. return iRead;
  238. }
  239. void CPPMPEG_Close()
  240. {
  241. maplay_Exit(0);
  242. if (MPEG) 
  243. {
  244.     delete stream;
  245. stream = NULL;
  246. delete header;
  247. header = NULL;
  248. }
  249. }
  250. // To interface with the Cool Edit File Filters API, we make "C" callable functions
  251. extern "C" {
  252. void MPEG_Close()
  253. {
  254. CPPMPEG_Close();
  255. }
  256. int MPEG_Read(BYTE * pBuffer)
  257. {
  258. return CPPMPEG_Read(pBuffer);
  259. }
  260. BOOL MPEG_Open(LPSTR szName)
  261. {
  262. return CPPMPEG_Open(szName);
  263. }
  264. BOOL MPEG_GetInfo(MPEG_INFO * mpi)
  265. {
  266. return CPPMPEG_GetInfo(mpi);
  267. }
  268. }