--- oup/current/Code/Exporters.pas 2006/12/23 16:26:43 46 +++ oup/current/Code/Exporters.pas 2007/01/11 22:45:20 74 @@ -5,24 +5,25 @@ interface uses Classes, Dialogs, StrUtils, SysUtils, Math, Data, OniImgClass; procedure ExportDatFile(fileid: LongWord; filename: String); +procedure ExportRawFiles(fileid: LongWord; filename: String); procedure ExportRawFile(fileid: LongWord; dat_offset: LongWord; filename: String); +function ExportConverted(fileid: LongWord; filename: String): Integer; -function ExportSNDD(fileid: LongWord; filename: String; convert: Boolean): Integer; -function ExportTRAC(fileid: LongWord; filename: String; convert: Boolean): Integer; -function ExportTXAN(fileid: LongWord; filename: String; convert: Boolean): Integer; -function ExportTXMB(fileid: LongWord; filename: String; convert: Boolean): Integer; -function ExportTXMP(fileid: LongWord; filename: String; convert: Boolean): Integer; - -var - ExportHandlers: array[1..1] of TExportHandlers = ( - // (Ext:'ABNA'; needed:False), - //(Ext:'AGDB'; needed:False), - (Ext: 'SNDD'; needed: True; Handler: ExportSNDD) -{ (Ext:'TRAC'; needed:True; Handler:ExportTRAC), - (Ext:'TXAN'; needed:True; Handler:ExportTXAN), - (Ext:'TXMB'; needed:True; Handler:ExportTXMB), - (Ext:'TXMP'; needed:True; Handler:ExportTXMP) -}); +function ExportSNDD(fileid: LongWord; filename: String): Integer; +function ExportTRAC(fileid: LongWord; filename: String): Integer; +function ExportTXAN(fileid: LongWord; filename: String): Integer; +function ExportImage(fileid: LongWord; filename: String): Integer; + +var + ExportHandlers: array[1..3] of TExportHandlers = ( +// (Ext:'ABNA'; needed:False), +// (Ext:'AGDB'; needed:False), + (Ext: 'SNDD'; needed: True; Handler: ExportSNDD), +// (Ext:'TRAC'; needed:True; Handler:ExportTRAC), +// (Ext:'TXAN'; needed:True; Handler:ExportTXAN), + (Ext:'TXMB'; needed:True; Handler:ExportImage), + (Ext:'TXMP'; needed:True; Handler:ExportImage) +); @@ -32,7 +33,6 @@ uses Functions, DataStructures, OniDataC - procedure ExportDatFile(fileid: LongWord; filename: String); var filestream: TFileStream; @@ -53,7 +53,16 @@ begin end; - +procedure ExportRawFiles(fileid: LongWord; filename: String); +var + i: Integer; + rawlist: TRawList; +begin + rawlist := OniDataConnection.GetRawList(fileid); + if Length(rawlist) > 0 then + for i := 0 to High(rawlist) do + ExportRawFile(fileid, rawlist[i].src_offset, filename); +end; procedure ExportRawFile(fileid: LongWord; dat_offset: LongWord; filename: String); var @@ -76,90 +85,98 @@ begin filestream.Free; end; +function ExportConverted(fileid: LongWord; filename: String): Integer; +var + i: Integer; + fileinfo: TFileInfo; +begin + fileinfo := OniDataConnection.GetFileInfo(fileid); + if Length(ExportHandlers) > 0 then + for i := 0 to High(ExportHandlers) do + if ExportHandlers[i].Ext = fileinfo.Extension then + ExportHandlers[i].Handler(fileid, filename); +end; + function ExportSNDD; -{ CONST - WAVheader:Array[0..0] OF Byte=( - Ord('R'),Ord('I'),Ord('F'),Ord('F'),0,0,0,0,Ord('W'),Ord('A'),Ord('V'),Ord('E'), - Ord('f'),Ord('m'),Ord('t'),Ord(' '),24,0,0,0, - ); -} type - TDatData = record +type + TDatData = packed record {0x00} - _fileid: LongWord; - level: LongWord; - Flag: LongWord; - FormatTag: Word; - ChanNo: Word; + _fileid: LongWord; + level: LongWord; + FormatSize: LongWord; + AudioFormat: Word; + NumChannels: Word; {0x10} - SampleRate: LongWord; - BytesPSec: LongWord; - BPSample: LongWord; - BitsPS: LongWord; - {0x20} - Unknown: array[1..7] of LongWord; - Unknown2: Word; + SampleRate: LongWord; + ByteRate: LongWord; + BlockAlign: Word; + BitsPerSample: Word; + {0x1C} + SizeExtHeader: Word; + SamplesPerBlock: Word; + NumCoefficients: Word; + Coefficients: array[0..6] of LongWord; + {0x3E} + Duration: Word; {0x40} - RawSize: LongWord; - RawPos: LongWord; + RawSize: LongWord; + RawPos: LongWord; end; var filestream: TFileStream; - DatData: TDatData; - //Wave Header Stuff - ASCII_Group: LongWord; //"RIFF" - WAV_Len: LongWord; - ASCII_WAV: LongWord; //"WAVE" - ASCII_FMT: LongWord; //"fmt " - WAV_FMT_Len: LongWord; - ASCII_DATA: LongWord; //"data" - WAV_FolLen: LongWord; - + i: Integer; Data: Tdata; + + //Wave Header Stuff + ASCII_RIFF: LongWord; //"RIFF" + WAVE_Len: LongWord; + ASCII_WAVE: LongWord; //"WAVE" + ASCII_FMT: LongWord; //"fmt " + WAVE_FMT_Len: LongWord; + ASCII_DATA: LongWord; //"data" + WAVE_DataLen: LongWord; begin Result := export_noerror; OniDataConnection.LoadDatFilePart(fileid, 0, SizeOf(DatData), @DatData); with DatData do begin //Initializing Header vars - ASCII_Group := 1179011410; // 'RIFF' - WAV_Len := RAWSize + 70; - ASCII_WAV := 1163280727; // 'WAVE' - ASCII_FMT := 544501094; // 'fmt ' - WAV_FMT_Len := 50; // 50 bytes - ASCII_DATA := 1635017060; // 'data' - WAV_FolLen := RAWSize; + ASCII_RIFF := 1179011410; // 'RIFF' + WAVE_Len := RAWSize + 70; + ASCII_WAVE := 1163280727; // 'WAVE' + ASCII_FMT := 544501094; // 'fmt ' + WAVE_FMT_Len := 50; // 50 bytes + ASCII_DATA := 1635017060; // 'data' + WAVE_DataLen := RAWSize; SetLength(Data, RAWSize); OniDataConnection.LoadRawFile(fileid, $44, Data); - filestream := TFileStream.Create(filename + '.raw', fmCreate); + //Now start packing this into a neat wave... + filestream := TFileStream.Create(filename + '.wav', fmCreate); + filestream.Write(ASCII_RIFF, SizeOf(ASCII_RIFF)); + filestream.Write(WAVE_Len, SizeOf(WAVE_Len)); + filestream.Write(ASCII_WAVE, SizeOf(ASCII_WAVE)); + filestream.Write(ASCII_FMT, SizeOf(ASCII_FMT)); + filestream.Write(WAVE_FMT_Len, SizeOf(WAVE_FMT_Len)); + filestream.Write(AudioFormat, SizeOf(AudioFormat)); + filestream.Write(NumChannels, SizeOf(NumChannels)); + filestream.Write(Samplerate, SizeOf(Samplerate)); + filestream.Write(ByteRate, SizeOf(ByteRate)); + filestream.Write(BlockAlign, SizeOf(BlockAlign)); + filestream.Write(BitsPerSample, SizeOf(BitsPerSample)); + filestream.Write(SizeExtHeader, SizeOf(SizeExtHeader)); + filestream.Write(SamplesPerBlock, SizeOf(SamplesPerBlock)); + filestream.Write(NumCoefficients, SizeOf(NumCoefficients)); + for i := 0 to High(Coefficients) do + filestream.Write(Coefficients[i], SizeOf(Coefficients[i])); + filestream.Write(ASCII_DATA, SizeOf(ASCII_DATA)); + filestream.Write(WAVE_DataLen, SizeOf(WAVE_DataLen)); filestream.Write(Data[0], Length(Data)); filestream.Free; - - if convert then - begin - //Now start packing this into a neat wave... - filestream := TFileStream.Create(filename + '.wav', fmCreate); - filestream.Write(ASCII_Group, SizeOf(ASCII_Group)); - filestream.Write(WAV_Len, SizeOf(WAV_Len)); - filestream.Write(ASCII_WAV, SizeOf(ASCII_WAV)); - filestream.Write(ASCII_FMT, SizeOf(ASCII_FMT)); - filestream.Write(WAV_FMT_Len, SizeOf(WAV_FMT_Len)); - filestream.Write(ChanNo, SizeOf(ChanNo)); - filestream.Write(Samplerate, SizeOf(Samplerate)); - filestream.Write(BytesPSec, SizeOf(BytesPSec)); - filestream.Write(BPSample, SizeOf(BPSample)); - filestream.Write(BitsPS, SizeOf(BitsPS)); - filestream.Write(Unknown[1], SizeOf(Unknown)); - filestream.Write(Unknown2, SizeOf(Unknown2)); - filestream.Write(ASCII_DATA, SizeOf(ASCII_DATA)); - filestream.Write(WAV_FolLen, SizeOf(WAV_FolLen)); - filestream.Write(Data[0], Length(Data)); - filestream.Free; - end; end; end; @@ -213,44 +230,22 @@ end; -function ExportTXMB; +function ExportImage; var filestream: TFileStream; - // img:TImgPackage; - Data: Tdata; -begin - Result := export_noerror; - if convert then - begin -{ img:=LoadTXMBconnected(fileid); - data:=ImgdataToBmp(img.imgx,img.imgy,img.imgdepth,img.storetype,img.imgdata); - filestream:=TFileStream.Create(filename+'.bmp',fmCreate); - filestream.Write(data[0],Length(data)); - filestream.Free; -} end; -end; - - - - -function ExportTXMP; -var - filestream: TFileStream; - // img:TImgPackage; + img: TOniImage; + data: Tdata; begin Result := export_noerror; -{ img:=LoadImgData(fileid); - filestream:=TFileStream.Create(filename+'.raw',fmCreate); - filestream.Write(img.imgdata[0],Length(img.imgdata)); - filestream.Free; + img := TOniImage.Create; + img.Load(fileid); + data := img.GetAsBMP; + img.Free; - IF convert THEN BEGIN - img.imgdata:=ImgdataToBMP(img.imgx,img.imgy,img.imgdepth,img.storetype,img.imgdata); - filestream:=TFileStream.Create(filename+'.bmp',fmCreate); - filestream.Write(img.imgdata[0],Length(img.imgdata)); - filestream.Free; - END; -} end; + filestream:=TFileStream.Create(filename+'.bmp',fmCreate); + filestream.Write(data[0],Length(data)); + filestream.Free; +end; end. \ No newline at end of file