* WARNING! It is quite unstable on Windows and it doesn't work on Linux for the moment because I didn't finish fixing the CODEC stream. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@975 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
		
			
				
	
	
		
			216 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			216 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
////////////////////////////////////////////////////////////////////////////////
 | 
						|
// Name:       mmriff.cpp
 | 
						|
// Purpose:    wxMMedia
 | 
						|
// Author:     Guilhem Lavaux
 | 
						|
// Created:    1997
 | 
						|
// Updated:    1998
 | 
						|
// Copyright:  (C) 1997, 1998, Guilhem Lavaux
 | 
						|
// License:    wxWindows license
 | 
						|
////////////////////////////////////////////////////////////////////////////////
 | 
						|
#ifdef __GNUG__
 | 
						|
#pragma implementation "mmriff.h"
 | 
						|
#endif
 | 
						|
 | 
						|
#ifdef WX_PRECOMP
 | 
						|
#include "wx_prec.h"
 | 
						|
#else
 | 
						|
#include "wx/wx.h"
 | 
						|
#endif
 | 
						|
#include "mmfile.h"
 | 
						|
#include "mmriff.h"
 | 
						|
 | 
						|
#ifdef __BORLANDC__
 | 
						|
#pragma hdrstop
 | 
						|
#endif
 | 
						|
 | 
						|
wxRiffCodec::wxRiffCodec() :
 | 
						|
  riff_i_stream(NULL), riff_o_stream(NULL), chunk_length(INVALID_CHUNK_LEN)
 | 
						|
{
 | 
						|
}
 | 
						|
 | 
						|
wxRiffCodec::wxRiffCodec(wxInputStream& s) :
 | 
						|
  riff_i_stream(&s), riff_o_stream(NULL), chunk_length(INVALID_CHUNK_LEN)
 | 
						|
{
 | 
						|
}
 | 
						|
 | 
						|
wxRiffCodec::wxRiffCodec(wxOutputStream& s) :
 | 
						|
  riff_i_stream(NULL), riff_o_stream(&s), chunk_length(INVALID_CHUNK_LEN)
 | 
						|
{
 | 
						|
}
 | 
						|
 | 
						|
wxRiffCodec::~wxRiffCodec()
 | 
						|
{
 | 
						|
}
 | 
						|
 | 
						|
bool wxRiffCodec::RiffReset(wxUint8 mode)
 | 
						|
{
 | 
						|
  switch (mode) {
 | 
						|
  case RIFF_READ:
 | 
						|
    if (!riff_i_stream)
 | 
						|
      return FALSE;
 | 
						|
    riff_i_stream->SeekI(0);
 | 
						|
    chunk_length = INVALID_CHUNK_LEN;
 | 
						|
    return TRUE;
 | 
						|
  case RIFF_WRITE:
 | 
						|
    if (!riff_o_stream)
 | 
						|
      return FALSE;
 | 
						|
    riff_o_stream->SeekO(0);
 | 
						|
    chunk_length = INVALID_CHUNK_LEN; 
 | 
						|
    return TRUE;
 | 
						|
  }
 | 
						|
  return FALSE;
 | 
						|
}
 | 
						|
 | 
						|
bool wxRiffCodec::ReadData(void *data, wxUint32 size)
 | 
						|
{
 | 
						|
  if (!riff_i_stream)
 | 
						|
    return FALSE;
 | 
						|
 | 
						|
  if (chunk_length != INVALID_CHUNK_LEN && (wxUint32)chunk_length < size) {
 | 
						|
    riff_error = wxMMFILE_EOF;
 | 
						|
    return FALSE;
 | 
						|
  }
 | 
						|
  if (chunk_length != INVALID_CHUNK_LEN)
 | 
						|
    chunk_length -= size;
 | 
						|
 | 
						|
  bool ret = (riff_i_stream->Read((char *)data, size).LastRead() == size);
 | 
						|
 | 
						|
  return ret;
 | 
						|
}
 | 
						|
 | 
						|
bool wxRiffCodec::WriteData(void *data, wxUint32 size)
 | 
						|
{
 | 
						|
  if (!riff_o_stream)
 | 
						|
    return FALSE;
 | 
						|
 | 
						|
  if (chunk_length < size) {
 | 
						|
    riff_error = wxMMFILE_EOF;
 | 
						|
    return FALSE;
 | 
						|
  }
 | 
						|
  chunk_length -= size;
 | 
						|
 | 
						|
  riff_o_stream->Write(data, size);
 | 
						|
 | 
						|
  return TRUE;
 | 
						|
}
 | 
						|
 | 
						|
bool wxRiffCodec::Read32(wxUint32& i32)
 | 
						|
{
 | 
						|
  wxUint8 i8[4];
 | 
						|
 | 
						|
  if (!ReadData(i8, 4))
 | 
						|
    return FALSE;
 | 
						|
 | 
						|
  i32 = i8[0];
 | 
						|
  i32 |= ((wxUint32)i8[1]) << 8;
 | 
						|
  i32 |= ((wxUint32)i8[2]) << 16;
 | 
						|
  i32 |= ((wxUint32)i8[3]) << 24;
 | 
						|
  
 | 
						|
  return TRUE;
 | 
						|
}
 | 
						|
 | 
						|
bool wxRiffCodec::Write32(wxUint32 i32)
 | 
						|
{
 | 
						|
  wxUint8 i8[4];
 | 
						|
 | 
						|
  i8[0] = i32 & 0xff;
 | 
						|
  i8[1] = (i32 >> 8) & 0xff;
 | 
						|
  i8[2] = (i32 >> 16) & 0xff;
 | 
						|
  i8[3] = (i32 >> 24) & 0xff;
 | 
						|
 | 
						|
  if (!WriteData(i8, 4))
 | 
						|
    return FALSE;
 | 
						|
 | 
						|
  return TRUE;
 | 
						|
}
 | 
						|
 | 
						|
bool wxRiffCodec::Read16(wxUint16& i16)
 | 
						|
{
 | 
						|
  wxUint8 i8[2];
 | 
						|
 | 
						|
  if (!ReadData(i8, 2))
 | 
						|
    return FALSE;
 | 
						|
 | 
						|
  i16 = i8[0];
 | 
						|
  i16 |= ((wxUint16)i8[1]) << 8;
 | 
						|
  
 | 
						|
  return TRUE;
 | 
						|
}
 | 
						|
 | 
						|
bool wxRiffCodec::Write16(wxUint16 i16)
 | 
						|
{
 | 
						|
  wxUint8 i8[2];
 | 
						|
 | 
						|
  i8[0] = i16 & 0xff;
 | 
						|
  i8[1] = (i16 >> 8) & 0xff;
 | 
						|
 | 
						|
  if (!WriteData(i8, 2))
 | 
						|
    return FALSE;
 | 
						|
 | 
						|
  return TRUE;
 | 
						|
}
 | 
						|
 | 
						|
bool wxRiffCodec::Skip(wxUint32 skip)
 | 
						|
{
 | 
						|
  if (!riff_i_stream || (chunk_length != INVALID_CHUNK_LEN && (wxInt32)skip > chunk_length))
 | 
						|
    return FALSE;
 | 
						|
 | 
						|
  if (chunk_length != INVALID_CHUNK_LEN)
 | 
						|
    chunk_length -= skip;
 | 
						|
  riff_i_stream->SeekI(skip, wxFromCurrent);
 | 
						|
 | 
						|
  return TRUE;
 | 
						|
}
 | 
						|
 | 
						|
bool wxRiffCodec::CreateChunk(const wxString& name, wxUint32 size)
 | 
						|
{
 | 
						|
  if (!riff_o_stream || name.Length() != 4)
 | 
						|
    return FALSE;
 | 
						|
 | 
						|
  if (riff_o_stream->Write(name.GetData(), 4).LastError()) {
 | 
						|
    riff_error = wxMMFILE_EOF;
 | 
						|
    return FALSE;
 | 
						|
  }
 | 
						|
 | 
						|
  chunk_length = size+4;
 | 
						|
 | 
						|
  return Write32(size);
 | 
						|
}
 | 
						|
 | 
						|
bool wxRiffCodec::FindChunk(const wxString& name, bool from_here)
 | 
						|
{
 | 
						|
  char buf[5];
 | 
						|
  wxString str2;
 | 
						|
 | 
						|
  if (!riff_i_stream)
 | 
						|
    return FALSE;
 | 
						|
 | 
						|
  if (chunk_length != INVALID_CHUNK_LEN && !from_here)
 | 
						|
    Skip(chunk_length);
 | 
						|
  while (1) {
 | 
						|
    if (riff_i_stream->Read(buf, 4).LastError()) {
 | 
						|
      riff_error = wxMMFILE_EOF;
 | 
						|
      return FALSE;
 | 
						|
    }
 | 
						|
 | 
						|
    chunk_length = INVALID_CHUNK_LEN;
 | 
						|
    if (!Read32(chunk_length)) {
 | 
						|
      riff_error = wxMMFILE_EOF;
 | 
						|
      return FALSE;
 | 
						|
    }
 | 
						|
 | 
						|
    buf[4] = 0;
 | 
						|
    str2 = buf;
 | 
						|
    if ((!name.IsNull()) && str2 != name) {
 | 
						|
      Skip(chunk_length);
 | 
						|
      continue;
 | 
						|
    }
 | 
						|
 | 
						|
    m_chunk = str2;
 | 
						|
 | 
						|
    return TRUE;
 | 
						|
  }
 | 
						|
 | 
						|
  return TRUE;
 | 
						|
}
 |