unsafe protected override void PreDetachVirtualChannel() { OpenALSoundWorld.criticalSection.Enter(); Al.alSourceStop(alSource); OpenALSoundWorld.CheckError(); if (currentSound is OpenALDataBufferSound) { if (currentSound is OpenALFileStreamSound) { OpenALSoundWorld.Instance.fileStreamRealChannels.Remove(this); } if (streamBuffer != null) { NativeUtils.Free((IntPtr)streamBuffer); streamBuffer = null; streamBufferSize = 0; } } Al.alSourcei(alSource, Al.AL_BUFFER, 0); OpenALSoundWorld.CheckError(); currentSound = null; OpenALSoundWorld.criticalSection.Leave(); }
unsafe internal protected override void PreDetachVirtualChannel() { OpenALSoundWorld.criticalSection.Enter(); Al.alSourceStop(alSource); OpenALSoundWorld.CheckError(); //never delete buffer because cannot delete. maybe need some time to free buffer internally ////delete al data buffers //if( streamAlDataBuffers != null ) //{ // fixed ( int* pAlDataBuffers = streamAlDataBuffers ) // Al.alDeleteBuffers( streamAlDataBuffers.Length, pAlDataBuffers ); // OpenALSoundWorld.CheckError(); // streamAlDataBuffers = null; //} if (currentSound is OpenALDataBufferSound) { if (currentSound is OpenALFileStreamSound) { OpenALSoundWorld.fileStreamRealChannels.Remove(this); } if (streamBuffer != null) { NativeUtility.Free((IntPtr)streamBuffer); streamBuffer = null; streamBufferSize = 0; } } fileStreamVorbisFile?.Dispose(); fileStreamVorbisFile = null; fileStreamVorbisFileReader?.Dispose(); fileStreamVorbisFileReader = null; Al.alSourcei(alSource, Al.AL_BUFFER, 0); OpenALSoundWorld.CheckError(); currentSound = null; OpenALSoundWorld.criticalSection.Leave(); }
unsafe protected override void PostAttachVirtualChannel() { OpenALSoundWorld.criticalSection.Enter(); currentSound = (OpenALSound)CurrentVirtualChannel.CurrentSound; OpenALSampleSound sampleSound = currentSound as OpenALSampleSound; OpenALDataBufferSound streamSound = null; OpenALFileStreamSound fileStreamSound = null; OpenALDataStreamSound dataStreamSound = null; if( sampleSound == null ) { streamSound = currentSound as OpenALDataBufferSound; fileStreamSound = currentSound as OpenALFileStreamSound; dataStreamSound = currentSound as OpenALDataStreamSound; } //create streamBuffer if( fileStreamSound != null ) { int bufferSize = 0; int numSamples = (int)fileStreamSound.vorbisFile.pcm_total( -1 ); int channels; int rate; fileStreamSound.vorbisFile.get_info( -1, out channels, out rate ); if( fileStreamSound.needConvertToMono ) channels = 1; int sizeInBytes = numSamples * channels * 2; bufferSize = sizeInBytes / 2; //!!!!!!!new if( bufferSize > 65536 * 4 ) bufferSize = 65536 * 4; //if( bufferSize > 65356 ) // bufferSize = 65356; streamBufferSize = bufferSize; streamBuffer = (byte*)NativeUtils.Alloc( NativeMemoryAllocationType.SoundAndVideo, streamBufferSize ); } if( dataStreamSound != null ) { streamBufferSize = dataStreamSound.bufferSize; streamBuffer = (byte*)NativeUtils.Alloc( NativeMemoryAllocationType.SoundAndVideo, streamBufferSize ); } //init source bool mode3d = ( currentSound.Mode & SoundMode.Mode3D ) != 0; bool loop = ( currentSound.Mode & SoundMode.Loop ) != 0; if( alSource == 0 ) { Al.alGenSources( 1, out alSource ); if( OpenALSoundWorld.CheckError() ) { PreDetachVirtualChannel(); OpenALSoundWorld.criticalSection.Leave(); return; } } if( sampleSound != null ) { //no stream sound Al.alSourcei( alSource, Al.AL_BUFFER, sampleSound.alBuffer ); if( OpenALSoundWorld.CheckError() ) { PreDetachVirtualChannel(); OpenALSoundWorld.criticalSection.Leave(); return; } } if( fileStreamSound != null ) FileStreamStartPlay(); if( dataStreamSound != null ) DataStreamStartPlay(); Al.alSourcei( alSource, Al.AL_SOURCE_RELATIVE, mode3d ? Al.AL_FALSE : Al.AL_TRUE ); //update parameters if( mode3d ) { UpdatePosition2(); UpdateVelocity2(); } else UpdatePan2(); UpdatePitch2(); UpdateVolume2(); if( sampleSound != null ) Al.alSourcei( alSource, Al.AL_LOOPING, loop ? Al.AL_TRUE : Al.AL_FALSE ); else Al.alSourcei( alSource, Al.AL_LOOPING, Al.AL_FALSE ); if( OpenALSoundWorld.CheckError() ) { PreDetachVirtualChannel(); OpenALSoundWorld.criticalSection.Leave(); return; } UpdateTime2(); //unpause Al.alSourcePlay( alSource ); OpenALSoundWorld.CheckError(); //add to fileStreamChannels if( fileStreamSound != null ) OpenALSoundWorld.Instance.fileStreamRealChannels.Add( this ); OpenALSoundWorld.criticalSection.Leave(); }
unsafe protected override void PreDetachVirtualChannel() { OpenALSoundWorld.criticalSection.Enter(); Al.alSourceStop( alSource ); OpenALSoundWorld.CheckError(); if( currentSound is OpenALDataBufferSound ) { if( currentSound is OpenALFileStreamSound ) OpenALSoundWorld.Instance.fileStreamRealChannels.Remove( this ); if( streamBuffer != null ) { NativeUtils.Free( (IntPtr)streamBuffer ); streamBuffer = null; streamBufferSize = 0; } } Al.alSourcei( alSource, Al.AL_BUFFER, 0 ); OpenALSoundWorld.CheckError(); currentSound = null; OpenALSoundWorld.criticalSection.Leave(); }
unsafe protected override void PostAttachVirtualChannel() { OpenALSoundWorld.criticalSection.Enter(); currentSound = (OpenALSound)CurrentVirtualChannel.CurrentSound; OpenALSampleSound sampleSound = currentSound as OpenALSampleSound; OpenALDataBufferSound streamSound = null; OpenALFileStreamSound fileStreamSound = null; OpenALDataStreamSound dataStreamSound = null; if (sampleSound == null) { streamSound = currentSound as OpenALDataBufferSound; fileStreamSound = currentSound as OpenALFileStreamSound; dataStreamSound = currentSound as OpenALDataStreamSound; } //create streamBuffer if (fileStreamSound != null) { int bufferSize = 0; int numSamples = (int)fileStreamSound.vorbisFile.pcm_total(-1); int channels; int rate; fileStreamSound.vorbisFile.get_info(-1, out channels, out rate); if (fileStreamSound.needConvertToMono) { channels = 1; } int sizeInBytes = numSamples * channels * 2; bufferSize = sizeInBytes / 2; if (bufferSize > 65536 * 4) { bufferSize = 65536 * 4; } streamBufferSize = bufferSize; streamBuffer = (byte *)NativeUtils.Alloc(NativeMemoryAllocationType.SoundAndVideo, streamBufferSize); } if (dataStreamSound != null) { streamBufferSize = dataStreamSound.bufferSize; streamBuffer = (byte *)NativeUtils.Alloc(NativeMemoryAllocationType.SoundAndVideo, streamBufferSize); } //init source bool mode3d = (currentSound.Mode & SoundMode.Mode3D) != 0; bool loop = (currentSound.Mode & SoundMode.Loop) != 0; if (alSource == 0) { Al.alGenSources(1, out alSource); if (OpenALSoundWorld.CheckError()) { PreDetachVirtualChannel(); OpenALSoundWorld.criticalSection.Leave(); return; } } if (sampleSound != null) { //no stream sound Al.alSourcei(alSource, Al.AL_BUFFER, sampleSound.alBuffer); if (OpenALSoundWorld.CheckError()) { PreDetachVirtualChannel(); OpenALSoundWorld.criticalSection.Leave(); return; } } if (fileStreamSound != null) { FileStreamStartPlay(); } if (dataStreamSound != null) { DataStreamStartPlay(); } Al.alSourcei(alSource, Al.AL_SOURCE_RELATIVE, mode3d ? Al.AL_FALSE : Al.AL_TRUE); //update parameters if (mode3d) { UpdatePosition2(); UpdateVelocity2(); } else { UpdatePan2(); } UpdatePitch2(); UpdateVolume2(); if (sampleSound != null) { Al.alSourcei(alSource, Al.AL_LOOPING, loop ? Al.AL_TRUE : Al.AL_FALSE); } else { Al.alSourcei(alSource, Al.AL_LOOPING, Al.AL_FALSE); } if (OpenALSoundWorld.CheckError()) { PreDetachVirtualChannel(); OpenALSoundWorld.criticalSection.Leave(); return; } UpdateTime2(); //unpause Al.alSourcePlay(alSource); OpenALSoundWorld.CheckError(); //add to fileStreamChannels if (fileStreamSound != null) { OpenALSoundWorld.Instance.fileStreamRealChannels.Add(this); } OpenALSoundWorld.criticalSection.Leave(); }
unsafe internal protected override void PostAttachVirtualChannel() { OpenALSoundWorld.criticalSection.Enter(); currentSound = (OpenALSound)CurrentVirtualChannel.Sound; OpenALSampleSound sampleSound = currentSound as OpenALSampleSound; OpenALDataBufferSound streamSound = null; OpenALFileStreamSound fileStreamSound = null; OpenALDataStreamSound dataStreamSound = null; if (sampleSound == null) { streamSound = currentSound as OpenALDataBufferSound; fileStreamSound = currentSound as OpenALFileStreamSound; dataStreamSound = currentSound as OpenALDataStreamSound; } //create streamBuffer if (fileStreamSound != null) { var stream = OpenALSoundWorld.CreateFileStream2(currentSound.Name); if (stream == null) { //Log.Warning( string.Format( "Creating sound \"{0}\" failed.", currentSound.Name ) ); PreDetachVirtualChannel(); OpenALSoundWorld.criticalSection.Leave(); return; } fileStreamVorbisFile = new VorbisFile.File(); fileStreamVorbisFileReader = new VorbisFileReader(stream, true); if (!fileStreamVorbisFileReader.OpenVorbisFile(fileStreamVorbisFile)) { //Log.Warning( string.Format( "Creating sound \"{0}\" failed.", currentSound.Name ) ); PreDetachVirtualChannel(); OpenALSoundWorld.criticalSection.Leave(); return; } int numSamples = (int)fileStreamVorbisFile.pcm_total(-1); fileStreamVorbisFile.get_info(-1, out var channels, out var frequency); //int numSamples = (int)fileStreamSound.vorbisFile.pcm_total( -1 ); //fileStreamSound.vorbisFile.get_info( -1, out var channels, out var rate ); if (fileStreamSound.needConvertToMono) { channels = 1; } int sizeInBytes = numSamples * channels * 2; int bufferSize = sizeInBytes / 2; if (bufferSize > 65536 * 4) { bufferSize = 65536 * 4; } streamBufferSize = bufferSize; streamBuffer = (byte *)NativeUtility.Alloc(NativeUtility.MemoryAllocationType.SoundAndVideo, streamBufferSize); } if (dataStreamSound != null) { streamBufferSize = dataStreamSound.bufferSize; streamBuffer = (byte *)NativeUtility.Alloc(NativeUtility.MemoryAllocationType.SoundAndVideo, streamBufferSize); } //create al data buffers if (fileStreamSound != null || dataStreamSound != null) { if (streamAlDataBuffers == null) { streamAlDataBuffers = new int[2]; fixed(int *pAlDataBuffers = streamAlDataBuffers) Al.alGenBuffers(streamAlDataBuffers.Length, pAlDataBuffers); if (OpenALSoundWorld.CheckError()) { streamAlDataBuffers = null; PreDetachVirtualChannel(); OpenALSoundWorld.criticalSection.Leave(); return; } } } //init source bool mode3d = (currentSound.Mode & SoundModes.Mode3D) != 0; bool loop = (currentSound.Mode & SoundModes.Loop) != 0; if (alSource == 0) { Al.alGenSources(1, out alSource); if (OpenALSoundWorld.CheckError()) { PreDetachVirtualChannel(); OpenALSoundWorld.criticalSection.Leave(); return; } } if (sampleSound != null) { //no stream sound Al.alSourcei(alSource, Al.AL_BUFFER, sampleSound.alBuffer); if (OpenALSoundWorld.CheckError()) { PreDetachVirtualChannel(); OpenALSoundWorld.criticalSection.Leave(); return; } } if (fileStreamSound != null) { FileStreamStartPlay(); } if (dataStreamSound != null) { DataStreamStartPlay(); } Al.alSourcei(alSource, Al.AL_SOURCE_RELATIVE, mode3d ? Al.AL_FALSE : Al.AL_TRUE); //update parameters if (mode3d) { UpdatePosition2(); UpdateVelocity2(); } else { UpdatePan2(); } UpdatePitch2(); UpdateVolume2(); if (sampleSound != null) { Al.alSourcei(alSource, Al.AL_LOOPING, loop ? Al.AL_TRUE : Al.AL_FALSE); } else { Al.alSourcei(alSource, Al.AL_LOOPING, Al.AL_FALSE); } if (OpenALSoundWorld.CheckError()) { PreDetachVirtualChannel(); OpenALSoundWorld.criticalSection.Leave(); return; } UpdateTime2(); //unpause Al.alSourcePlay(alSource); OpenALSoundWorld.CheckError(); //add to fileStreamChannels if (fileStreamSound != null) { OpenALSoundWorld.fileStreamRealChannels.Add(this); } OpenALSoundWorld.criticalSection.Leave(); }