unsafe int /*HRESULT*/ SetPrimaryBufferFormat(int primaryChannels, int primaryFrequency, int primaryBitRate, bool allowLogError) { int hr; void */*IDirectSoundBuffer*/ primaryBuffer = null; // Get the primary buffer DSBUFFERDESC bufferDesc = new DSBUFFERDESC(); //ZeroMemory( &bufferDesc, sizeof( DSBUFFERDESC ) ); bufferDesc.dwSize = (uint)sizeof(DSBUFFERDESC); bufferDesc.dwFlags = /*DSound.DSBCAPS_CTRL3D | */ DSound.DSBCAPS_PRIMARYBUFFER; //bufferDesc.dwBufferBytes = 0; //bufferDesc.lpwfxFormat = NULL; hr = IDirectSound8.CreateSoundBuffer(directSound, ref bufferDesc, out primaryBuffer, null); if (Wrapper.FAILED(hr)) { if (allowLogError) { Error("CreateSoundBuffer", hr); } return(hr); } WAVEFORMATEX waveFormat = new WAVEFORMATEX(); //ZeroMemory( &waveFormat, sizeof( WAVEFORMATEX ) ); waveFormat.wFormatTag = (ushort)DSound.WAVE_FORMAT_PCM; waveFormat.nChannels = (ushort)primaryChannels; waveFormat.nSamplesPerSec = (uint)primaryFrequency; waveFormat.wBitsPerSample = (ushort)primaryBitRate; waveFormat.nBlockAlign = (ushort)(waveFormat.wBitsPerSample / 8 * waveFormat.nChannels); waveFormat.nAvgBytesPerSec = (uint)(waveFormat.nSamplesPerSec * waveFormat.nBlockAlign); hr = IDirectSoundBuffer.SetFormat(primaryBuffer, ref waveFormat); if (Wrapper.FAILED(hr)) { IDirectSoundBuffer.Release(primaryBuffer); if (allowLogError) { Error("SetFormat", hr); } return(hr); } IDirectSoundBuffer.Release(primaryBuffer); return(DSound.S_OK); }
unsafe int/*HRESULT*/ SetPrimaryBufferFormat( int primaryChannels, int primaryFrequency, int primaryBitRate, bool allowLogError ) { int hr; void*/*IDirectSoundBuffer*/ primaryBuffer = null; // Get the primary buffer DSBUFFERDESC bufferDesc = new DSBUFFERDESC(); //ZeroMemory( &bufferDesc, sizeof( DSBUFFERDESC ) ); bufferDesc.dwSize = (uint)sizeof( DSBUFFERDESC ); bufferDesc.dwFlags = /*DSound.DSBCAPS_CTRL3D | */DSound.DSBCAPS_PRIMARYBUFFER; //bufferDesc.dwBufferBytes = 0; //bufferDesc.lpwfxFormat = NULL; hr = IDirectSound8.CreateSoundBuffer( directSound, ref bufferDesc, out primaryBuffer, null ); if( Wrapper.FAILED( hr ) ) { if( allowLogError ) Error( "CreateSoundBuffer", hr ); return hr; } WAVEFORMATEX waveFormat = new WAVEFORMATEX(); //ZeroMemory( &waveFormat, sizeof( WAVEFORMATEX ) ); waveFormat.wFormatTag = (ushort)DSound.WAVE_FORMAT_PCM; waveFormat.nChannels = (ushort)primaryChannels; waveFormat.nSamplesPerSec = (uint)primaryFrequency; waveFormat.wBitsPerSample = (ushort)primaryBitRate; waveFormat.nBlockAlign = (ushort)( waveFormat.wBitsPerSample / 8 * waveFormat.nChannels ); waveFormat.nAvgBytesPerSec = (uint)( waveFormat.nSamplesPerSec * waveFormat.nBlockAlign ); hr = IDirectSoundBuffer.SetFormat( primaryBuffer, ref waveFormat ); if( Wrapper.FAILED( hr ) ) { IDirectSoundBuffer.Release( primaryBuffer ); if( allowLogError ) Error( "SetFormat", hr ); return hr; } IDirectSoundBuffer.Release( primaryBuffer ); return DSound.S_OK; }
unsafe IDirectSoundBuffer *CreateBuffer(int needBufferSize) { uint creationFlags = 0; if ((int)(Mode & SoundMode.Mode3D) != 0) { creationFlags |= DSound.DSBCAPS_CTRL3D; } else { creationFlags |= DSound.DSBCAPS_CTRLPAN; } if ((int)(Mode & SoundMode.Software) != 0) { creationFlags |= DSound.DSBCAPS_LOCSOFTWARE; } creationFlags |= DSound.DSBCAPS_CTRLFREQUENCY; creationFlags |= DSound.DSBCAPS_CTRLVOLUME; creationFlags |= DSound.DSBCAPS_GETCURRENTPOSITION2; if ((creationFlags & DSound.DSBCAPS_CTRLFX) != 0) { //нельзя DuplicateSoundBuffer делать для DSBCAPS_CTRLFX //не забыть патом данные заливать во все буферы Log.Fatal("(creationFlags & DSBCAPS_CTRLFX) != 0."); } int hr; void */*IDirectSoundBuffer*/ soundBuffer; if (soundBuffers.Count == 0) { DSBUFFERDESC bufferDesc = new DSBUFFERDESC(); //ZeroMemory( &bufferDesc, sizeof( DSBUFFERDESC ) ); bufferDesc.dwSize = (uint)sizeof(DSBUFFERDESC); bufferDesc.dwFlags = creationFlags; bufferDesc.dwBufferBytes = (uint)needBufferSize; bufferDesc.guid3DAlgorithm = DSound.DS3DALG_DEFAULT; bufferDesc.lpwfxFormat = waveFormat; hr = IDirectSound8.CreateSoundBuffer(DirectSoundWorld.Instance.directSound, ref bufferDesc, out soundBuffer, null); //hr = DirectSoundWorld.Instance.directSound->CreateSoundBuffer( // &bufferDesc, &soundBuffer, NULL ); if (Wrapper.FAILED(hr)) { DirectSoundWorld.Warning("CreateSoundBuffer", hr); return(null); } //get bufferSize DSBCAPS bufferCaps = new DSBCAPS(); //ZeroMemory( &bufferCaps, sizeof( DSBCAPS ) ); bufferCaps.dwSize = (uint)sizeof(DSBCAPS); IDirectSoundBuffer.GetCaps(soundBuffer, ref bufferCaps); bufferSize = (int)bufferCaps.dwBufferBytes; } else { hr = IDirectSound8.DuplicateSoundBuffer(DirectSoundWorld.Instance.directSound, (IDirectSoundBuffer *)soundBuffers[0].ToPointer(), out soundBuffer); if (Wrapper.FAILED(hr)) { DirectSoundWorld.Warning("DuplicateSoundBuffer", hr); return(null); } } return((IDirectSoundBuffer *)soundBuffer); }
unsafe protected override bool InitLibrary(IntPtr mainWindowHandle, int maxReal2DChannels, int maxReal3DChannels) { NativeLibraryManager.PreLoadLibrary("libogg"); NativeLibraryManager.PreLoadLibrary("libvorbis"); NativeLibraryManager.PreLoadLibrary("libvorbisfile"); NativeLibraryManager.PreLoadLibrary("DirectSoundNativeWrapper"); { DSoundStructureSizes sizes = new DSoundStructureSizes(); sizes.Init(); DSoundStructureSizes originalSizes; DSound.GetStructureSizes(out originalSizes); FieldInfo[] fields = sizes.GetType().GetFields( BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public); foreach (FieldInfo field in fields) { int originalSize = (int)field.GetValue(originalSizes); int size = (int)field.GetValue(sizes); if (originalSize != size) { Log.Fatal("DirectXSoundSystem: Invalid unmanaged bridge. " + "Invalid \"{0}\". Native size = \"{1}\". Managed size = \"{2}\".", field.Name, originalSize, size); return(false); } } } instance = this; criticalSection = CriticalSection.Create(); DSound.CoInitialize(null); int hr; //create IDirectSound using the primary sound device void */*IDirectSound8*/ directSoundTemp; hr = DSound.DirectSoundCreate8(null, out directSoundTemp, null); if (Wrapper.FAILED(hr)) { if (hr == DSound.Get_DSERR_NODRIVER()) { Log.InvisibleInfo("DirectXSoundSystem: No sound driver."); return(false); } Error("DirectSoundCreate8", hr); return(false); } directSound = (IDirectSound8 *)directSoundTemp; //set DirectSound cooperative level hWnd = mainWindowHandle; hr = IDirectSound8.SetCooperativeLevel(directSound, hWnd, DSound.DSSCL_PRIORITY); if (Wrapper.FAILED(hr)) { Error("SetCooperativeLevel", hr); return(false); } //set primary buffer format { hr = SetPrimaryBufferFormat(2, 44100, 16, false); if (Wrapper.FAILED(hr)) { hr = SetPrimaryBufferFormat(2, 22050, 16, true); } if (Wrapper.FAILED(hr)) { return(false); } } //get listener { void */*IDirectSoundBuffer*/ primaryBuffer = null; // Obtain primary buffer, asking it for 3D control DSBUFFERDESC bufferDesc = new DSBUFFERDESC(); //ZeroMemory( &bufferDesc, sizeof( DSBUFFERDESC ) ); bufferDesc.dwSize = (uint)sizeof(DSBUFFERDESC); bufferDesc.dwFlags = DSound.DSBCAPS_CTRL3D | DSound.DSBCAPS_PRIMARYBUFFER; hr = IDirectSound8.CreateSoundBuffer(directSound, ref bufferDesc, out primaryBuffer, null); if (Wrapper.FAILED(hr)) { Error("CreateSoundBuffer", hr); return(false); } void */*IDirectSound3DListener*/ listenerTemp = null; GUID guid = DSound.IID_IDirectSound3DListener; if (Wrapper.FAILED(hr = IDirectSoundBuffer.QueryInterface(primaryBuffer, ref guid, &listenerTemp))) { IDirectSoundBuffer.Release(primaryBuffer); Error("QueryInterface", hr); return(false); } listener = (IDirectSound3DListener *)listenerTemp; IDirectSoundBuffer.Release(primaryBuffer); } //update general parameters { DS3DLISTENER parameters = new DS3DLISTENER(); parameters.dwSize = (uint)sizeof(DS3DLISTENER); IDirectSound3DListener.GetAllParameters(listener, ref parameters); parameters.flDistanceFactor = 1; parameters.flRolloffFactor = 0; parameters.flDopplerFactor = DopplerScale; hr = IDirectSound3DListener.SetAllParameters(listener, ref parameters, DSound.DS3D_IMMEDIATE); if (Wrapper.FAILED(hr)) { Warning("IDirectSound3DListener.SetAllParameters", hr); } } GenerateRecordDriverList(); //Channels realChannels = new List <DirectSoundRealChannel>(); for (int n = 0; n < maxReal2DChannels; n++) { DirectSoundRealChannel realChannel = new DirectSoundRealChannel(); AddRealChannel(realChannel, false); realChannels.Add(realChannel); } for (int n = 0; n < maxReal3DChannels; n++) { DirectSoundRealChannel realChannel = new DirectSoundRealChannel(); AddRealChannel(realChannel, true); realChannels.Add(realChannel); } fileStreamRealChannels = new List <DirectSoundRealChannel>(); thread = new Thread(new ThreadStart(ThreadFunction)); thread.CurrentCulture = new System.Globalization.CultureInfo("en-US"); thread.IsBackground = true; thread.Start(); return(true); }
unsafe protected override bool InitLibrary( IntPtr mainWindowHandle, int maxReal2DChannels, int maxReal3DChannels ) { NativeLibraryManager.PreLoadLibrary( "libogg" ); NativeLibraryManager.PreLoadLibrary( "libvorbis" ); NativeLibraryManager.PreLoadLibrary( "libvorbisfile" ); NativeLibraryManager.PreLoadLibrary( "DirectSoundNativeWrapper" ); { DSoundStructureSizes sizes = new DSoundStructureSizes(); sizes.Init(); DSoundStructureSizes originalSizes; DSound.GetStructureSizes( out originalSizes ); FieldInfo[] fields = sizes.GetType().GetFields( BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public ); foreach( FieldInfo field in fields ) { int originalSize = (int)field.GetValue( originalSizes ); int size = (int)field.GetValue( sizes ); if( originalSize != size ) { Log.Fatal( "DirectXSoundSystem: Invalid unmanaged bridge. " + "Invalid \"{0}\". Native size = \"{1}\". Managed size = \"{2}\".", field.Name, originalSize, size ); return false; } } } instance = this; criticalSection = CriticalSection.Create(); DSound.CoInitialize( null ); int hr; //create IDirectSound using the primary sound device void*/*IDirectSound8*/ directSoundTemp; hr = DSound.DirectSoundCreate8( null, out directSoundTemp, null ); if( Wrapper.FAILED( hr ) ) { if( hr == DSound.Get_DSERR_NODRIVER() ) { Log.InvisibleInfo( "DirectXSoundSystem: No sound driver." ); return false; } Error( "DirectSoundCreate8", hr ); return false; } directSound = (IDirectSound8*)directSoundTemp; //set DirectSound cooperative level hWnd = mainWindowHandle; hr = IDirectSound8.SetCooperativeLevel( directSound, hWnd, DSound.DSSCL_PRIORITY ); if( Wrapper.FAILED( hr ) ) { Error( "SetCooperativeLevel", hr ); return false; } //set primary buffer format { hr = SetPrimaryBufferFormat( 2, 44100, 16, false ); if( Wrapper.FAILED( hr ) ) hr = SetPrimaryBufferFormat( 2, 22050, 16, true ); if( Wrapper.FAILED( hr ) ) return false; } //get listener { void*/*IDirectSoundBuffer*/ primaryBuffer = null; // Obtain primary buffer, asking it for 3D control DSBUFFERDESC bufferDesc = new DSBUFFERDESC(); //ZeroMemory( &bufferDesc, sizeof( DSBUFFERDESC ) ); bufferDesc.dwSize = (uint)sizeof( DSBUFFERDESC ); bufferDesc.dwFlags = DSound.DSBCAPS_CTRL3D | DSound.DSBCAPS_PRIMARYBUFFER; hr = IDirectSound8.CreateSoundBuffer( directSound, ref bufferDesc, out primaryBuffer, null ); if( Wrapper.FAILED( hr ) ) { Error( "CreateSoundBuffer", hr ); return false; } void*/*IDirectSound3DListener*/ listenerTemp = null; GUID guid = DSound.IID_IDirectSound3DListener; if( Wrapper.FAILED( hr = IDirectSoundBuffer.QueryInterface( primaryBuffer, ref guid, &listenerTemp ) ) ) { IDirectSoundBuffer.Release( primaryBuffer ); Error( "QueryInterface", hr ); return false; } listener = (IDirectSound3DListener*)listenerTemp; IDirectSoundBuffer.Release( primaryBuffer ); } //update general parameters { DS3DLISTENER parameters = new DS3DLISTENER(); parameters.dwSize = (uint)sizeof( DS3DLISTENER ); IDirectSound3DListener.GetAllParameters( listener, ref parameters ); parameters.flDistanceFactor = 1; parameters.flRolloffFactor = 0; parameters.flDopplerFactor = DopplerScale; hr = IDirectSound3DListener.SetAllParameters( listener, ref parameters, DSound.DS3D_IMMEDIATE ); if( Wrapper.FAILED( hr ) ) Warning( "IDirectSound3DListener.SetAllParameters", hr ); } GenerateRecordDriverList(); //Channels realChannels = new List<DirectSoundRealChannel>(); for( int n = 0; n < maxReal2DChannels; n++ ) { DirectSoundRealChannel realChannel = new DirectSoundRealChannel(); AddRealChannel( realChannel, false ); realChannels.Add( realChannel ); } for( int n = 0; n < maxReal3DChannels; n++ ) { DirectSoundRealChannel realChannel = new DirectSoundRealChannel(); AddRealChannel( realChannel, true ); realChannels.Add( realChannel ); } fileStreamRealChannels = new List<DirectSoundRealChannel>(); thread = new Thread( new ThreadStart( ThreadFunction ) ); thread.CurrentCulture = new System.Globalization.CultureInfo( "en-US" ); thread.IsBackground = true; thread.Start(); return true; }
public unsafe static extern int CreateSoundBuffer(void */*IDirectSound8*/ _this, ref DSBUFFERDESC pcDSBufferDesc, out void */*IDirectSoundBuffer*/ ppDSBuffer, void *pUnkOuter);
public unsafe static extern int CreateSoundBuffer( void*/*IDirectSound8*/ _this, ref DSBUFFERDESC pcDSBufferDesc, out void*/*IDirectSoundBuffer*/ ppDSBuffer, void* pUnkOuter );
unsafe IDirectSoundBuffer* CreateBuffer( int needBufferSize ) { uint creationFlags = 0; if( (int)( Mode & SoundMode.Mode3D ) != 0 ) creationFlags |= DSound.DSBCAPS_CTRL3D; else creationFlags |= DSound.DSBCAPS_CTRLPAN; if( (int)( Mode & SoundMode.Software ) != 0 ) creationFlags |= DSound.DSBCAPS_LOCSOFTWARE; creationFlags |= DSound.DSBCAPS_CTRLFREQUENCY; creationFlags |= DSound.DSBCAPS_CTRLVOLUME; creationFlags |= DSound.DSBCAPS_GETCURRENTPOSITION2; if( ( creationFlags & DSound.DSBCAPS_CTRLFX ) != 0 ) { //нельзя DuplicateSoundBuffer делать для DSBCAPS_CTRLFX //не забыть патом данные заливать во все буферы Log.Fatal( "(creationFlags & DSBCAPS_CTRLFX) != 0." ); } int hr; void*/*IDirectSoundBuffer*/ soundBuffer; if( soundBuffers.Count == 0 ) { DSBUFFERDESC bufferDesc = new DSBUFFERDESC(); //ZeroMemory( &bufferDesc, sizeof( DSBUFFERDESC ) ); bufferDesc.dwSize = (uint)sizeof( DSBUFFERDESC ); bufferDesc.dwFlags = creationFlags; bufferDesc.dwBufferBytes = (uint)needBufferSize; bufferDesc.guid3DAlgorithm = DSound.DS3DALG_DEFAULT; bufferDesc.lpwfxFormat = waveFormat; hr = IDirectSound8.CreateSoundBuffer( DirectSoundWorld.Instance.directSound, ref bufferDesc, out soundBuffer, null ); //hr = DirectSoundWorld.Instance.directSound->CreateSoundBuffer( // &bufferDesc, &soundBuffer, NULL ); if( Wrapper.FAILED( hr ) ) { DirectSoundWorld.Warning( "CreateSoundBuffer", hr ); return null; } //get bufferSize DSBCAPS bufferCaps = new DSBCAPS(); //ZeroMemory( &bufferCaps, sizeof( DSBCAPS ) ); bufferCaps.dwSize = (uint)sizeof( DSBCAPS ); IDirectSoundBuffer.GetCaps( soundBuffer, ref bufferCaps ); bufferSize = (int)bufferCaps.dwBufferBytes; } else { hr = IDirectSound8.DuplicateSoundBuffer( DirectSoundWorld.Instance.directSound, (IDirectSoundBuffer*)soundBuffers[ 0 ].ToPointer(), out soundBuffer ); if( Wrapper.FAILED( hr ) ) { DirectSoundWorld.Warning( "DuplicateSoundBuffer", hr ); return null; } } return (IDirectSoundBuffer*)soundBuffer; }