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(); }
/// <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(); }
public override AudioSource CreateSource(Submixer mixer = null) { return(new XA2Source(this, (XA2Submixer)mixer)); }
public override AudioSource CreateSource(Submixer mixer = null) { return(new ALSource()); }
/// <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)) { }