Example #1
0
        public SoundSink(AudioEngine audioEngine, AudioFormat?format = null,
                         Submixer submixer = null, ISoundSinkReceiver receiver = null)
        {
            if (format.HasValue)
            {
                _format = format.Value;
            }
            else
            {
                _format = new AudioFormat {
                    SampleRate = 44_100, Channels = 2, BitsPerSample = 16
                };
            }

            var silenceDataCount = (int)(_format.Channels * _format.SampleRate * sizeof(ushort) * SampleQuantum.TotalSeconds);

            _silenceData = new byte[silenceDataCount];

            Engine           = audioEngine;
            _receiver        = receiver;
            _chain           = new BufferChain(Engine);
            _circBuffer      = new CircularBuffer(_silenceData.Length);
            _tempBuf         = new byte[_silenceData.Length];
            _submixer        = submixer;
            _sinkThread      = new Thread(MainLoop);
            _sinkThread.Name = "SoundSink";
            _sinkThread.Start();
        }
Example #2
0
        /// <summary>
        /// Initializes a new instance of the <see cref="SharpAudio.Codec.SoundStream" /> class.
        /// </summary>
        /// <param name="stream">The file stream of the target music file.</param>
        /// <param name="engine">The target <see cref="AudioEngine"/></param>
        /// <param name="mixer">The <see cref="Submixer"/> to use</param>
        /// <param name="autoDisposeSink">Dispose the <see cref="SoundSink"/> when finished.</param>
        public SoundStream(Stream stream, AudioEngine engine, Submixer mixer = null, bool autoDisposeSink = true)
        {
            _targetStream    = stream ?? throw new ArgumentNullException(nameof(stream));
            _autoDisposeSink = autoDisposeSink;

            if (stream == null)
            {
                throw new ArgumentNullException(nameof(stream));
            }

            if (!stream.CanSeek)
            {
                _decoder   = new FFmpegDecoder(stream);
                IsStreamed = true;
            }
            else
            {
                var fourcc = stream.ReadFourCc();
                stream.Seek(0, SeekOrigin.Begin);

                if (fourcc.SequenceEqual(MakeFourCC("RIFF")))
                {
                    _decoder   = new WaveDecoder(stream);
                    IsStreamed = false;
                }
                else if (fourcc.SequenceEqual(MakeFourCC("ID3\u0001")) ||
                         fourcc.SequenceEqual(MakeFourCC("ID3\u0002")) ||
                         fourcc.SequenceEqual(MakeFourCC("ID3\u0003")) ||
                         fourcc.AsSpan(0, 2).SequenceEqual(new byte[] { 0xFF, 0xFB }))
                {
                    _decoder   = new Mp3Decoder(stream);
                    IsStreamed = true;
                }
                else if (fourcc.SequenceEqual(MakeFourCC("OggS")))
                {
                    _decoder   = new VorbisDecoder(stream);
                    IsStreamed = true;
                }
                else
                {
                    _decoder   = new FFmpegDecoder(stream);
                    IsStreamed = true;
                }
            }

            _soundSink = new SoundSink(engine, _decoder.Format, mixer);

            _streamThread      = new Thread(MainLoop);
            _streamThread.Name = "SoundStream";
            _streamThread.Start();
        }
Example #3
0
 public override AudioSource CreateSource(Submixer mixer = null)
 {
     return(new XA2Source(this, (XA2Submixer)mixer));
 }
Example #4
0
 public override AudioSource CreateSource(Submixer mixer = null)
 {
     return(new ALSource());
 }
Example #5
0
 /// <summary>
 /// Initializes a new instance of the <see cref="SharpAudio.Codec.SoundStream" /> class.
 /// </summary>
 /// <param name="stream">The file stream of the target music file.</param>
 /// <param name="engine">The target <see cref="AudioEngine"/></param>
 /// <param name="mixer">The <see cref="Submixer"/> to use</param>
 public SoundStream(Stream stream, AudioEngine engine, Submixer mixer = null) : this(stream, new SoundSink(engine, mixer))
 {
 }