protected virtual void OnFreeDevice() { if (!BassAsioDevice.IsInitialized) { return; } BassAsioDevice.Free(); }
public override void Connect(IBassStreamComponent previous) { if (previous.Channels > BassAsioDevice.Info.Outputs) { //TODO: We should down mix. Logger.Write(this, LogLevel.Error, "Cannot play stream with more channels than device outputs."); throw new NotImplementedException(string.Format("The stream contains {0} channels which is greater than {1} output channels provided by the device.", previous.Channels, BassAsioDevice.Info.Outputs)); } if (!this.CheckFormat(this.Rate, previous.Channels)) { Logger.Write(this, LogLevel.Error, "Cannot play stream with unsupported rate."); throw new NotImplementedException(string.Format("The stream has a rate of {0} which is not supported by the device.", this.Rate)); } var exception = default(Exception); for (var a = 1; a <= CONNECT_ATTEMPTS; a++) { Logger.Write(this, LogLevel.Debug, "Configuring ASIO, attempt: {0}", a); try { if (BassAsioUtils.OK(this.ConfigureASIO(previous))) { var success = default(bool); if (previous.Flags.HasFlag(BassFlags.DSDRaw) || BassUtils.GetChannelDsdRaw(previous.ChannelHandle)) { success = BassAsioUtils.OK(this.ConfigureASIO_DSD(previous)); } else { success = BassAsioUtils.OK(this.ConfigureASIO_PCM(previous)); } if (success) { Logger.Write(this, LogLevel.Debug, "Configured ASIO."); return; } } } catch (Exception e) { exception = e; Logger.Write(this, LogLevel.Warn, "Failed to configure ASIO: {0}", e.Message); if (BassAsioDevice.IsInitialized) { Logger.Write(this, LogLevel.Warn, "Re-initializing ASIO, have you just switched from DSD to PCM?"); BassAsioDevice.Free(); BassAsioDevice.Init(); } } Thread.Sleep(CONNECT_ATTEMPT_INTERVAL); } if (exception != null) { throw exception; } throw new NotImplementedException(); }
protected override void OnDisposing() { if (this.ChannelHandle != 0) { Logger.Write(this, LogLevel.Debug, "Freeing BASS stream: {0}", this.ChannelHandle); BassUtils.OK(Bass.StreamFree(this.ChannelHandle)); //Not checking result code as it contains an error if the application is shutting down. } this.Stop(); BassAsioDevice.Free(); base.OnDisposing(); }
protected virtual void OnInitDevice() { if (BassAsioDevice.IsInitialized) { return; } BassAsioDevice.Init(this.AsioDevice); if (this.Output.EnforceRate && !BassAsioDevice.Info.SupportedRates.Contains(this.Output.Rate)) { var supportedRates = string.Join( ", ", BassAsioDevice.Info.SupportedRates ); Logger.Write(this, LogLevel.Error, "The output rate {0} is not supported by the device, supported rates are: {1}", this.Output.Rate, supportedRates); BassAsioDevice.Free(); throw new NotImplementedException(string.Format("The output rate {0} is not supported by the device, supported rates are: {1}", this.Output.Rate, supportedRates)); } }
protected virtual void OnInit(object sender, EventArgs e) { if (!this.Enabled) { return; } this.IsInitialized = true; BassAsioUtils.OK(Bass.Configure(global::ManagedBass.Configuration.UpdateThreads, 0)); BassAsioUtils.OK(Bass.Configure(global::ManagedBass.Configuration.PlaybackBufferLength, this.Output.BufferLength)); BassAsioUtils.OK(Bass.Configure(global::ManagedBass.Configuration.SRCQuality, this.Output.ResamplingQuality)); BassAsioUtils.OK(Bass.Init(Bass.NoSoundDevice)); //Always detect device for now. //if (BassAsioDevice.Info != null && BassAsioDevice.Info.Device != this.AsioDevice) { BassAsioDevice.Detect(this.AsioDevice); } Logger.Write(this, LogLevel.Debug, "BASS (No Sound) Initialized."); }
protected virtual void ConfigureASIO(IBassStreamComponent previous) { if (previous.Flags.HasFlag(BassFlags.DSDRaw)) { this.Rate = previous.Rate; this.Flags |= BassFlags.DSDRaw; } else { if (this.Behaviour.Output.EnforceRate) { if (!BassAsioDevice.Info.SupportedRates.Contains(this.Rate)) { var nearestRate = BassAsioDevice.Info.GetNearestRate(this.Rate); Logger.Write(this, LogLevel.Warn, "Enforced rate {0} isn't supposed by the device, falling back to {1}.", this.Rate, nearestRate); this.Rate = nearestRate; } else { //Enfoced rate is supported by the device, nothing to do. } } else { if (!BassAsioDevice.Info.SupportedRates.Contains(previous.Rate)) { var nearestRate = BassAsioDevice.Info.GetNearestRate(previous.Rate); Logger.Write(this, LogLevel.Debug, "Stream rate {0} isn't supposed by the device, falling back to {1}.", this.Rate, nearestRate); this.Rate = nearestRate; } else { //Stream rate is supported by the device, nothing to do. this.Rate = previous.Rate; } } } BassAsioDevice.Init( this.Behaviour.AsioDevice, this.Rate, this.Channels, this.Flags ); }