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

多媒体编程

开发平台:

Visual C++

  1. /*  @(#) cep_obuffer.cpp, last edit: 4/9/1998
  2.  *  @(#) Copyright (C) 1998 Syntrillium Software (www.syntrillium.com)
  3.  *
  4.  *  This program is free software; you can redistribute it and/or modify
  5.  *  it under the terms of the GNU General Public License as published by
  6.  *  the Free Software Foundation; either version 2 of the License, or
  7.  *  (at your option) any later version.
  8.  *
  9.  *  This program is distributed in the hope that it will be useful,
  10.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  11.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12.  *  GNU General Public License for more details.
  13.  *
  14.  *  You should have received a copy of the GNU General Public License
  15.  *  along with this program; if not, write to the Free Software
  16.  *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  17.  *
  18. The only output buffer thing we need for Cool Edit integeration
  19. */
  20. #ifdef  __WIN32__
  21. #include <windows.h>
  22. #ifndef WIN32GUI
  23. #include <iostream.h>
  24. #endif
  25. #include "header.h"
  26. #include "args.h"
  27. #include "obuffer.h"
  28. #include "CEP_Obuffer.h"
  29. #define MAXFRAMESFORWRITE 12
  30. CEP_Obuffer::CEP_Obuffer(uint32 number_of_channels,
  31.      MPEG_Args *maplay_args)
  32. {
  33.   channels  = number_of_channels;
  34.   data_size = channels * OBUFFERSIZE * 2; // double to make for floats
  35.   if (maplay_args->MPEGheader->version() == MPEG2_LSF)
  36.      data_size >>= 1;
  37.   if (maplay_args->MPEGheader->layer() == 1)
  38.      data_size /= 3;
  39.   temp = new BYTE[data_size*MAXFRAMESFORWRITE];
  40.   uint32 i;
  41.   for(i=0; i<channels; i++)
  42.    bufferp[i] = i << 2; // corrected, was i * channels
  43. }
  44. void CEP_Obuffer::append (uint32 channel, real value)
  45. {
  46.   // Need to break up the 32-bit integer into 2 8-bit bytes.
  47.   // (ignore the first two bytes - either 0x0000 or 0xffff)
  48.   // Note that Intel byte order is backwards!!!
  49. float * pTemp=(float *)(temp+bufferp[channel]);
  50. *pTemp=(float)(value);
  51.   //temp[bufferp[channel]]   = (BYTE) (value & 0xff);
  52.   //temp[bufferp[channel]+1] = (BYTE) (value >> 8);
  53.   bufferp[channel] += channels << 2; // byte advancing
  54.   return;
  55. }
  56. void CEP_Obuffer::appendblock (uint32 channel, real * pvalues, int iCount)
  57. {
  58.   // Need to break up the 32-bit integer into 2 8-bit bytes.
  59.   // (ignore the first two bytes - either 0x0000 or 0xffff)
  60.   // Note that Intel byte order is backwards!!!
  61. float * pTemp=(float *)(temp+bufferp[channel]);
  62. int iIncrement=(channels<<2)/4;
  63. bufferp[channel]+=(channels<<2)*iCount;
  64. while (iCount--)
  65. { *pTemp=*pvalues++;
  66. pTemp+=iIncrement;
  67. }
  68. return;
  69. }
  70. void CEP_Obuffer::write_buffer(int32 fd)
  71. // we really don't need to do anything but reset here
  72.   // Reset buffer pointers
  73.   //uint32 i;
  74.   //for(i=0; i<channels; i++)
  75.   //  bufferp[i] = i * channels;
  76.   return;
  77. }
  78. BYTE * CEP_Obuffer::get_buffer(int * piNumBytes)
  79. {
  80. *piNumBytes=bufferp[channels-1]-((channels-1)<<2);
  81. // And reset for next time through
  82. uint32 i;
  83.     for(i=0; i<channels; i++)
  84.    bufferp[i] = i << 2; // corrected, was i * channels
  85. return temp;
  86. }
  87. CEP_Obuffer::~CEP_Obuffer()
  88. {
  89. // Mark the current chunk as dirty and flush it
  90.    // Free the buffer memory
  91.   delete [] temp;
  92. }
  93. Obuffer *create_CEP_Obuffer(MPEG_Args *maplay_args)
  94. {
  95. Obuffer *buffer;
  96. enum e_mode mode = maplay_args->MPEGheader->mode();
  97. enum e_channels which_channels = maplay_args->which_c;
  98. if ((mode == single_channel) || (which_channels != both))
  99. buffer = new CEP_Obuffer(1, maplay_args); // mono
  100. else
  101. buffer = new CEP_Obuffer(2, maplay_args); // stereo
  102. return(buffer);
  103. }
  104. #endif // __WIN32__