Esempio n. 1
0
        bool IAudioStreamProvider.ReadStream(INativeAudioBuffer targetBuffer)
        {
            if (openmpt_module == IntPtr.Zero)
            {
                return(false);
            }

            int count = openmpt_module_read_interleaved_stereo(
                openmpt_module,
                SampleRate,
                BufferSize >> 1, // Buffer size per channel
                audioBuffer
                );

            if (count == 0)
            {
                return(false);
            }

            targetBuffer.LoadData(
                SampleRate,
                audioBuffer,
                count << 1, // Number of samples (left + right)
                    AudioDataLayout.LeftRight,
                    AudioDataElementType.Short
                );
            return(true);
        }
Esempio n. 2
0
        public static void LoadData <T>(
            this INativeAudioBuffer buffer,
            int sampleRate,
            T[] data,
            int dataLength,
            AudioDataLayout dataLayout,
            AudioDataElementType dataElementType) where T : struct
        {
            if (dataLength < 0)
            {
                throw new ArgumentOutOfRangeException("dataLength", "Data length cannot be negative");
            }
            if (dataLength > data.Length)
            {
                throw new ArgumentOutOfRangeException("dataLength", "Data length cannot exceed the specified arrays length.");
            }

            int itemSize = Marshal.SizeOf(typeof(T));

            using (PinnedArrayHandle pinned = new PinnedArrayHandle(data))
            {
                buffer.LoadData(
                    sampleRate,
                    pinned.Address,
                    itemSize * dataLength,
                    dataLayout,
                    dataElementType);
            }
        }
Esempio n. 3
0
        bool IAudioStreamProvider.ReadStream(INativeAudioBuffer targetBuffer)
        {
            if (!OggVorbis.IsStreamValid(this.strOvStr))
            {
                return(false);
            }

            AudioData audioDataRes = this.audioData.Res;
            PcmData   pcm;
            bool      eof = !OggVorbis.StreamChunk(this.strOvStr, out pcm);

            if (eof)
            {
                OggVorbis.EndStream(ref this.strOvStr);
                if (this.looped)
                {
                    OggVorbis.BeginStreamFromMemory(audioDataRes.OggVorbisData, out this.strOvStr);
                    if (pcm.DataLength == 0)
                    {
                        eof = !OggVorbis.StreamChunk(this.strOvStr, out pcm);
                    }
                    else
                    {
                        eof = false;
                    }
                }
            }

            if (pcm.DataLength > 0)
            {
                targetBuffer.LoadData(
                    pcm.SampleRate,
                    pcm.Data,
                    pcm.DataLength,
                    pcm.ChannelCount == 1 ? AudioDataLayout.Mono : AudioDataLayout.LeftRight,
                    AudioDataElementType.Short);
            }

            return(pcm.DataLength != 0 && !eof);
        }
Esempio n. 4
0
        bool IAudioStreamProvider.ReadStream(INativeAudioBuffer targetBuffer)
        {
            if (!OggVorbis.IsStreamValid(this.strOvStr))
                return false;

            AudioData audioDataRes = this.audioData.Res;
            PcmData pcm;
            bool eof = !OggVorbis.StreamChunk(this.strOvStr, out pcm);
            if (eof)
            {
                OggVorbis.EndStream(ref this.strOvStr);
                if (this.looped)
                {
                    OggVorbis.BeginStreamFromMemory(audioDataRes.OggVorbisData, out this.strOvStr);
                    if (pcm.DataLength == 0)
                        eof = !OggVorbis.StreamChunk(this.strOvStr, out pcm);
                    else
                        eof = false;
                }
            }

            if (pcm.DataLength > 0)
            {
                targetBuffer.LoadData(
                    pcm.SampleRate,
                    pcm.Data,
                    pcm.DataLength,
                    pcm.ChannelCount == 1 ? AudioDataLayout.Mono : AudioDataLayout.LeftRight,
                    AudioDataElementType.Short);
            }

            return pcm.DataLength != 0 && !eof;
        }