public override int Decode(int nHandle, IntPtr pDest, uint szDestSize, int bLoop) { #region [ xaデータのデコード ] xastreamheader = new XASTREAMHEADER(); unsafe { fixed(byte *pXaBuf = srcBuf) { byte *pWavBuf = (byte *)pDest; xastreamheader.pSrc = pXaBuf; xastreamheader.nSrcLen = xaheader.nDataLen; xastreamheader.nSrcUsed = 0; xastreamheader.pDst = pWavBuf; xastreamheader.nDstLen = szDestSize; xastreamheader.nDstUsed = 0; if (!xaDecodeConvert((IntPtr)nHandle, ref xastreamheader)) { Trace.TraceError("Error: xaDecodeConvert(): " + Path.GetFileName(filename)); return(-1); } } } #region [ デバッグ表示 ] //Debug.WriteLine( "**XASTREAMHEADER**" ); //Debug.WriteLine( "nSrcLen= " + xastreamheader.nSrcLen ); //Debug.WriteLine( "nSrcUsed= " + xastreamheader.nSrcUsed ); //Debug.WriteLine( "nDstLen= " + xastreamheader.nDstLen ); //Debug.WriteLine( "nDstUsed= " + xastreamheader.nDstUsed ); #endregion #endregion return(0); }
public extern static bool xaDecodeConvert(IntPtr hxas, ref XASTREAMHEADER psh);
//#region [ IDisposable 実装 ] ////----------------- //private bool bDispose完了済み = false; //public void Dispose() //{ // if ( !this.bDispose完了済み ) // { // if ( srcBuf != null ) // { // srcBuf = null; // } // if ( dstBuf != null ) // { // dstBuf = null; // } // if ( this.nHandle >= 0 ) // { // this.Close( this.nHandle ); // this.nHandle = -1; // } // this.bDispose完了済み = true; // } //} ////----------------- //#endregion #if false /// <summary> /// xaファイルを読み込んで、wavにdecodeする /// </summary> /// <param name="filename">xaファイル名</param> /// <param name="wavBuf">wavファイルが格納されるバッファ</param> /// <returns></returns> public bool Decode(string filename, out byte[] wavBuf) { // Debug.WriteLine( "xa: Decode: " + Path.GetFileName( filename ) ); #region [ XAヘッダと、XAデータの読み出し ] xaheader = new XAHEADER(); byte[] xaBuf; using (FileStream fs = new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) // FileShare を付けとかないと、Close() 後もロックがかかる?? { using (BinaryReader br = new BinaryReader(fs)) { xaheader.id = br.ReadUInt32(); xaheader.nDataLen = br.ReadUInt32(); xaheader.nSamples = br.ReadUInt32(); xaheader.nSamplesPerSec = br.ReadUInt16(); xaheader.nBits = br.ReadByte(); xaheader.nChannels = br.ReadByte(); xaheader.nLoopPtr = br.ReadUInt32(); xaheader.befL = new short[2]; xaheader.befR = new short[2]; xaheader.pad = new byte[4]; xaheader.befL[0] = br.ReadInt16(); xaheader.befL[1] = br.ReadInt16(); xaheader.befR[0] = br.ReadInt16(); xaheader.befR[1] = br.ReadInt16(); xaheader.pad = br.ReadBytes(4); xaBuf = new byte[xaheader.nDataLen]; xaBuf = br.ReadBytes((int)xaheader.nDataLen); } } //string xaid = Encoding.ASCII.GetString( xah.id ); #region [ デバッグ表示 ] //Debug.WriteLine( "**XAHEADER**" ); //Debug.WriteLine( "id= " + xaheader.id.ToString( "X8" ) ); //Debug.WriteLine( "nDataLen= " + xaheader.nDataLen.ToString( "X8" ) ); //Debug.WriteLine( "nSamples= " + xaheader.nSamples.ToString( "X8" ) ); //Debug.WriteLine( "nSamplesPerSec= " + xaheader.nSamplesPerSec.ToString( "X4" ) ); //Debug.WriteLine( "nBits= " + xaheader.nBits.ToString( "X2" ) ); //Debug.WriteLine( "nChannels= " + xaheader.nChannels.ToString( "X2" ) ); //Debug.WriteLine( "nLoopPtr= " + xaheader.nLoopPtr.ToString( "X8" ) ); //Debug.WriteLine( "befL[0]= " + xaheader.befL[ 0 ].ToString( "X4" ) ); //Debug.WriteLine( "befL[1]= " + xaheader.befL[ 1 ].ToString( "X4" ) ); //Debug.WriteLine( "befR[0]= " + xaheader.befR[ 0 ].ToString( "X4" ) ); //Debug.WriteLine( "befR[1]= " + xaheader.befR[ 1 ].ToString( "X4" ) ); #endregion #endregion object lockobj = new object(); lock ( lockobj ) // スレッドセーフじゃないかも知れないので、念のため { #region [ WAVEFORMEX情報の取得 ] waveformatex = new CWin32.WAVEFORMATEX(); IntPtr hxas = xaDecodeOpen(ref xaheader, out waveformatex); if (hxas == null) { Trace.TraceError("Error: xaDecodeOpen(): " + Path.GetFileName(filename)); wavBuf = null; return(false); } #region [ デバッグ表示 ] //Debug.WriteLine( "**WAVEFORMATEX**" ); //Debug.WriteLine( "wFormatTag= " + waveformatex.wFormatTag.ToString( "X4" ) ); //Debug.WriteLine( "nChannels = " + waveformatex.nChannels.ToString( "X4" ) ); //Debug.WriteLine( "nSamplesPerSec= " + waveformatex.nSamplesPerSec.ToString( "X8" ) ); //Debug.WriteLine( "nAvgBytesPerSec= " + waveformatex.nAvgBytesPerSec.ToString( "X8" ) ); //Debug.WriteLine( "nBlockAlign= " + waveformatex.nBlockAlign.ToString( "X4" ) ); //Debug.WriteLine( "wBitsPerSample= " + waveformatex.wBitsPerSample.ToString( "X4" ) ); //Debug.WriteLine( "cbSize= " + waveformatex.cbSize.ToString( "X4" ) ); #endregion #endregion #region [ データ長の取得 ] uint dlen; xaDecodeSize(hxas, xaheader.nDataLen, out dlen); #region [ デバッグ表示 ] //Debug.WriteLine( "**INTERNAL VALUE**" ); //Debug.WriteLine( "dlen= " + dlen ); #endregion #endregion #region [ xaデータのデコード ] wavBuf = new byte[dlen]; xastreamheader = new XASTREAMHEADER(); unsafe { fixed(byte *pXaBuf = xaBuf, pWavBuf = wavBuf) { xastreamheader.pSrc = pXaBuf; xastreamheader.nSrcLen = xaheader.nDataLen; xastreamheader.nSrcUsed = 0; xastreamheader.pDst = pWavBuf; xastreamheader.nDstLen = dlen; xastreamheader.nDstUsed = 0; bool b = xaDecodeConvert(hxas, ref xastreamheader); if (!b) { Trace.TraceError("Error: xaDecodeConvert(): " + Path.GetFileName(filename)); wavBuf = null; return(false); } } } #region [ デバッグ表示 ] //Debug.WriteLine( "**XASTREAMHEADER**" ); //Debug.WriteLine( "nSrcLen= " + xastreamheader.nSrcLen ); //Debug.WriteLine( "nSrcUsed= " + xastreamheader.nSrcUsed ); //Debug.WriteLine( "nDstLen= " + xastreamheader.nDstLen ); //Debug.WriteLine( "nDstUsed= " + xastreamheader.nDstUsed ); #endregion #endregion #region [ xaファイルのクローズ ] bool bb = xaDecodeClose(hxas); if (!bb) { Trace.TraceError("Error: xaDecodeClose(): " + Path.GetFileName(filename)); } #endregion } return(true); }