예제 #1
0
        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();
        }
예제 #2
0
        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();
        }
예제 #3
0
		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();
		}
예제 #4
0
		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();
		}
예제 #5
0
        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();
        }
예제 #6
0
        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();
        }