FileStream fs = new FileStream(@"c:/x/t.txt.bak", FileMode.Open, FileAccess.Read); byte[] sbuf = new byte[fs.Length]; BinaryReader br = new System.IO.BinaryReader(fs);
br.Read(sbuf, 0, (
int)fs.Length); int times = 2; byte[] buf = new byte[sbuf.Length * times]; for (int i = 0; i < sbuf.Length; i++){
for (int n = 0; n < times; n++){
buf[i * times + n] = sbuf[i];
}
}
DxVBLibA.
DirectSoundSecondaryBuffer8 dsToneBuffer = WavUtility.CreateWav(this.Handle.ToInt32(), buf);dsToneBuffer.SaveToFile(
@"c:/x/wavtest.wav"); MessageBox.Show("done");
======================
using
System;using
System.Collections.Generic;using
System.Text;
namespace
WaveConvert{
public class WavUtility{
const int SRATE = 44100;//Sampling Rate const double DUR = 1;//Tone duration const double FREQ = 500;//Tone frequency public static DxVBLibA.DirectSoundSecondaryBuffer8 CreateWav(int hwnd, byte[] orgdata){
byte[] data = new byte[orgdata.Length + 455]; for (int i = 0; i < 255; i++){
data[i] = (
byte)i;}
for (int i = 255; i < 100 + 255; i++){
data[i] =
byte.MaxValue;}
for (int i = data.Length - 100; i < data.Length; i++){
data[i] =
byte.MaxValue;}
Array.Copy(orgdata, 0, data, 355, orgdata.Length);
DxVBLibA.
DirectX8 DX = new DxVBLibA.DirectX8();DxVBLibA.
DirectSound8 DS = DX.DirectSoundCreate(string.Empty);DS.SetCooperativeLevel(hwnd, DxVBLibA.
CONST_DSSCLFLAGS.DSSCL_NORMAL);DxVBLibA.
DSBUFFERDESC desc = new DxVBLibA.DSBUFFERDESC();#region
wFormatTag // Waveform-audio format type. // Format tags are registered with Microsoft Corporation for many compression algorithms. // A complete list of format tags can be found in the Mmreg.h header file. // For one- or two-channel PCM data, this value should be WAVE_FORMAT_PCM.#endregion
desc.fxFormat.nFormatTag = (
short)DxVBLibA.CONST_DSOUND.WAVE_FORMAT_PCM;#region
cbSize // Size, in bytes, of extra format information appended to the end of the WAVEFORMATEX structure. // This information can be used by non-PCM formats to store extra attributes for the wFormatTag. // If no extra information is required by the wFormatTag, this member must be set to zero. // For WAVE_FORMAT_PCM formats, this member is ignored.#endregion
desc.fxFormat.nSize = 0;
desc.fxFormat.lExtra = 0;
#region
nChannels // Number of channels in the waveform-audio data. Monaural data uses one channel and stereo data uses two channels.#endregion
desc.fxFormat.nChannels = 1;
#region
nSamplesPerSec // Sample rate, in samples per second (hertz). // If wFormatTag is WAVE_FORMAT_PCM, // then common values for nSamplesPerSec are 8.0 kHz, 11.025 kHz, 22.05 kHz, and 44.1 kHz. For non-PCM formats, // this member must be computed according to the manufacturer's specification of the format tag.#endregion
desc.fxFormat.lSamplesPerSec = SRATE;
#region
wBitsPerSample // Bits per sample for the wFormatTag format type. If wFormatTag is WAVE_FORMAT_PCM, // then wBitsPerSample should be equal to 8 or 16. // If wFormatTag is WAVE_FORMAT_EXTENSIBLE, this value can be any integer multiple of 8.#endregion
desc.fxFormat.nBitsPerSample = 16;
#region
nBlockAlign // Block alignment, in bytes. The block alignment is the minimum atomic unit of data for the wFormatTag format type. // If wFormatTag is WAVE_FORMAT_PCM or WAVE_FORMAT_EXTENSIBLE, // nBlockAlign must be equal to the product of nChannels and wBitsPerSample divided by 8 (bits per byte). // For non-PCM formats, this member must be computed according to the manufacturer's specification of the format tag. // Software must process a multiple of nBlockAlign bytes of data at a time. // Data written and read from a device must always start at the beginning of a block. // For example, it is illegal to start playback of PCM data in the middle of a sample (that is, on a non-block-aligned boundary).#endregion
desc.fxFormat.nBlockAlign = (
short)(desc.fxFormat.nChannels * desc.fxFormat.nBitsPerSample / 8);#region
nAvgBytesPerSec // Required average data-transfer rate, in bytes per second, for the format tag. // If wFormatTag is WAVE_FORMAT_PCM, nAvgBytesPerSec should be equal to the product of nSamplesPerSec and nBlockAlign. // For non-PCM formats, this member must be computed according to the manufacturer's specification of the format tag.#endregion
desc.fxFormat.lAvgBytesPerSec = desc.fxFormat.lSamplesPerSec * desc.fxFormat.nBlockAlign;
desc.lFlags = 0;
desc.lBufferBytes = data.Length;
DxVBLibA.
DirectSoundSecondaryBuffer8 dsToneBuffer = DS.CreateSoundBuffer(ref desc);System.Runtime.InteropServices.
GCHandle hmem = System.Runtime.InteropServices.GCHandle.Alloc(data, System.Runtime.InteropServices.GCHandleType.Pinned); IntPtr aaa = hmem.AddrOfPinnedObject();dsToneBuffer.WriteBuffer(0, data.Length, aaa, DxVBLibA.
CONST_DSBLOCKFLAGS.DSBLOCK_DEFAULT);hmem.Free();
return dsToneBuffer;}
}
}