Laden...

Verzerrungen bei mehrmaliger Soundwiedergabe aus byte[] buffer mit BASS.net

Erstellt von CaptainIglo vor 17 Jahren Letzter Beitrag vor 17 Jahren 1.033 Views
C
CaptainIglo Themenstarter:in
366 Beiträge seit 2005
vor 17 Jahren
Verzerrungen bei mehrmaliger Soundwiedergabe aus byte[] buffer mit BASS.net

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()));
            }
        }
C
CaptainIglo Themenstarter:in
366 Beiträge seit 2005
vor 17 Jahren

Problem gelöst!
Fehler war in einer anderen Funktion und der FillQueue-Thread lief mehrmals parallel...