Hi,
ich verwende momentan BASS.net 2.3 zur Soundwiedergabe und bekomme von einer 2. Klasse ein byte[]-Array übergeben, in welchem die Musik liegt.
Aus diesem Array erstelle ich dan einen BASS_Stream welcher auch problemlos abspielt (ich kann soger das Array erst zu ende füllen, wenn schon abgespielt wird, solange die Daten an der aktuellen Position schon vorhanden sind).
Wenn ich aber ein neues Lied lade (oder auch das selbe nochmals) kommt es beim Abspielen zu sehr merkwürdingen Verzerrungen und ganzen Aussetzern. Dies passiert manchmal aber auch erst nach einem 3. oder 4. Neustart der Abspielroutine.
Weiß jemand was ich dagegen tun kann, oder auch eine andere Sound-Library welcher ich ein byte[]-Array übergeben kann, wo MP3/WAV/WMA-Daten gespeichert sind und diese auch abspielt, wenn das Array noch nicht "voll" ist (Daten kommen erst per Networkstream an)?
Hier meine Routinen:
Die File-Load-Routine:
private void btnLoad_Click(object sender, EventArgs e)
{
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
Stop();
Bass.BASS_PluginFree(0);
Bass.BASS_Stop();
Bass.BASS_Free();
Bass.BASS_Init(-1, 44100, BASSInit.BASS_DEVICE_DEFAULT, 0, null);
fillQueue = new Thread(new ThreadStart(FillQueue));
fillQueue.Start();
while (bytesRead < size)
Thread.Sleep(10);
Play();
}
}
Der Thread, der das Array füllt (Simulation des Networkstreams):
private void FillQueue()
{
Stream inp = File.OpenRead(openFileDialog1.FileName);
bytesRead = 0;
buffer = new byte[inp.Length];
inp.Seek(0, SeekOrigin.Begin);
while (inp.ReadByte() != -1)
{
inp.Seek(-1, SeekOrigin.Current);
buffer[bytesRead] = Convert.ToByte(inp.ReadByte());
bytesRead++;
if (bytesRead > size && bytesRead % 100 == 0)
{
Thread.Sleep(1);
}
}
inp.Close();
}
Die Abspielroutine:
private void Play()
{
if (stream == 0)
{
stream = Bass.BASS_StreamCreateFile(buffer, 0, buffer.Length, BASSStream.BASS_DEFAULT);
length = (int)(Bass.BASS_ChannelGetLength(stream) / 1000);
trackBarPos.Maximum = length;
trackBarPos.Value = 0;
}
if (stream != 0 && Bass.BASS_ChannelPlay(stream, false))
{
//playing...
timerUpdate.Start();
playing = true;
}
else
{
MessageBox.Show(this, "Error: " + Enum.GetName(typeof(BASSErrorCode), Bass.BASS_ErrorGetCode()));
}
}
Problem gelöst!
Fehler war in einer anderen Funktion und der FillQueue-Thread lief mehrmals parallel...