Probleme mit Thread beim Streaming

Status
Nicht offen für weitere Antworten.
S

Spacerat

Gast
Hallo

Ich hab' da mal wieder ein Problem mit meinem "AudioDevice". Beim Streaming in eine Line ("line.write()") bekomme ich ständig eine extrem hohe Prozessorauslastung (teilweise sogar 100%). Also: Das Device definiert einen Clip, welcher zunächst den gesammten Stream in einem ByteArray speichert (wie es eben beim Clip vorgesehen ist). Beim starten wird ein Thread gestartet, welcher das ByteArray paketweise in eine SourceDataLine, welche ebenfalls vom Device definiert wird, schreibt.
Code:
// die open Methoden der Klasse Clip
public synchronized void open(AudioInputStream stream)
throws LineUnavailableException
{
  if(isOpen()) throw LINE_UNAVAILABLE;
  try {
    ByteArrayOutputStream out = new ByteArrayOutputStream();
    byte[] buf = new byte[stream.available()];
    while(stream.read(buf) != -1) {
      out.write(buf);
    }
    out.close();
    buf = out.toByteArray();
    open(stream.getFormat(), buf, 0, buf.length);
  } catch(Throwable e) {
    throw DBSDataLine.LINE_UNAVAILABLE;
  }
}

public synchronized void open(AudioFormat format, byte[] data, int offset, int bufferSize)
throws LineUnavailableException
{
  if(isOpen()) throw LINE_UNAVAILABLE;
  this.data = new byte[bufferSize];
  System.arraycopy(data, offset, this.data, 0, bufferSize);
  framesize = ((format.getSampleSizeInBits() + 7) / 8) * format.getChannels();
  if(bufferSize % framesize != 0) throw new IllegalArgumentException("bufferSize is not a multiplier of the resulting framesize");
  fpos = 0;
  bufferSize = (int) (format.getSampleRate() / 25.0F) * framesize;
  buffer = new byte[Math.min(bufferSize, this.data.length)];
  line.open(format, buffer.length);
}
Code:
// die run Methode des Clip-Threads
public void run()
{
  int bpos = 0, dpos = 0;
  while(!isInterrupted()) {
    while(dpos < data.length) {
      bpos = dpos % buffer.length;
      fpos = dpos / framesize;
      buffer[bpos] = data[dpos];
      if(loop[0] != 0) {
        if(fpos == loop[2]) {
          dpos = (loop[1]) * framesize;
          loop[0]--;
          if(loop[0] < 0) loop[0] = -1;
        }
      }
      if(dpos != 0 && bpos == 0) {
        line.write(buffer, 0, buffer.length);
        Arrays.fill(buffer, (byte) 0);
        try {
          Thread.sleep(30L);
        } catch(InterruptedException e) {
          interrupt();
        }
      }
      dpos++;
    }
    if(bpos != 0) {
      line.write(buffer, 0, bpos + 1);
      line.drain();
      interrupt();
    }
  }
  line.flush();
  line.stop();
  renderer = null;
}
Code:
// die open Methode der SourceDataLine
public synchronized void open(javax.sound.sampled.AudioFormat format, int bufferSize)
throws LineUnavailableException
{
  if(isOpen() || (this.format = dev.getALFormat(format)) == null) throw LINE_UNAVAILABLE;
  if((bufferSize % this.format.minFrameSize) != 0 || bufferSize <= 0) throw INVALID_BUFFERSIZE;
  try {
    this.bufferSize = bufferSize;
    buffers = new ByteBuffer[BUFFERS]; // z.Zt werden 64 Puffer erstellt
    for(bufferSize = 0; bufferSize < BUFFERS; bufferSize++) buffers[bufferSize] = ByteBuffer.allocate(this.bufferSize);
    al.alGenSources(1, source, 0);
    al.alSourcei(source[0], AL_SOURCE_TYPE, AL_STREAMING);
    al.alGenBuffers(BUFFERS, qbuffer, 0);
    al.alSourcef(source[0], AL_ROLLOFF_FACTOR, 0.0f);
    al.alSourcei(source[0], AL_SOURCE_RELATIVE, AL_TRUE);
    dispatch(new LineEvent(this, LineEvent.Type.OPEN, getFramePosition()));
  } catch(Throwable e) {
    throw LINE_UNAVAILABLE;
  }
}
Code:
// die für write relevanten Methoden
public synchronized int write(byte[] b, int off, int len)
{
  if(b == null || b.length < off + len || (len % this.format.minFrameSize) != 0) throw INVALID_BUFFERSIZE;
  if(!isOpen() || b == null || b.length - off < len) return 0;
  active = true;
  written = 0;
  do {
    al.alGetSourcei(source[0], AL_BUFFERS_QUEUED, state, 3);
    if(state[3] < BUFFERS) {
      written += fillBuffer(b, written + off, len - written);
    }
    unQueueProcessed();
    active = written != len;
  } while(active);
  return written;
}

private void unQueueProcessed()
{
  al.alGetSourcei(source[0], AL_SOURCE_STATE, state, 0);
  if(started && state[0] != AL_PLAYING) {
    al.alSourcePlay(source[0]);
  }
  al.alGetSourcei(source[0], AL_BUFFERS_PROCESSED, state, 2);
  if(state[2] != 0) {
    al.alSourceUnqueueBuffers(source[0], state[2], ubuffer, ubuf);
    ubuf += state[2];
    ubuf %= BUFFERS;
  }
}

private int fillBuffer(byte[] b, int offset, int length)
{
  int n, m, s;
  for(n = 0; n < length; n += format.sampleSizeInBytes) {
    s = 0;
    for(m = 0; m < format.sampleSizeInBytes; m++) {
      s <<= 8;
      s |= b[((!format.isBigEndian())? n + format.sampleSizeInBytes - 1 - m : n + m) + offset] & 0xFF;
    }
    s += format.bias;
    s &= format.mask;
    for(m = 0; m < format.sampleSizeInBytes; m++) {
      buffers[qbuf].put(n + m, (byte) s);
      s >>= 8;
    }
  }
  buffers[qbuf].position(0);
  al.alBufferData(qbuffer[qbuf], format.alenum, buffers[qbuf], length, format.sampleRateInt);
  al.alSourceQueueBuffers(source[0], 1, qbuffer, qbuf);
  qbuf++;
  qbuf %= BUFFERS;
  return length;
}
Hab' das auch schon mit 12,5FPS und sleeptime 79 versucht. Hab' sogar schon das halbe "com.sun.media.sound"-Paket decompiliert um zu schauen wie die es machen. Wie es ausschaut arbeiten die OpenAL-Methoden so wie sie sollen, aber irgend etwas blockiert halt. Ich verzweifle schon dran... (deswegen poste ich es ja auch hier). Hoffe mir kann jemand helfen.
edit: Zu allem übel zeigt ein jüngstes Experiment, das der Thread auch beim Schreiben in eine "normale" Line stottert oder den Prozessor auslastet. Hmmm.
edit2: grad' von einer Lösung geträumt :) ... Hab' bei bufferSize wohl vergessen, das audiodaten auch aus mehreren bytes (bis zu 4) bestehen können. also noch mal mit framesize multipliziert. Lösts aber auch nicht wirklich...
 
Zuletzt bearbeitet von einem Moderator:
S

Spacerat

Gast
... gibt's irgend einen Grund für diese Ignoranz? Seid ih überfordert? (wie ich grad') PUSH...
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Point & Click Thread Probleme Spiele- und Multimedia-Programmierung 20
E Scaling Probleme Spiele- und Multimedia-Programmierung 6
J Probleme bei Pong Spiele- und Multimedia-Programmierung 9
D Java Bomberman Probleme java.lang.NullPointerException Spiele- und Multimedia-Programmierung 1
J YoutubeAPI Livestream probleme Spiele- und Multimedia-Programmierung 3
G [LibGDX] Button Klick Probleme Spiele- und Multimedia-Programmierung 1
T Probleme mit JButton Spiele- und Multimedia-Programmierung 5
T Probleme bei "Pixel-Fighting"-Spiel: Unausgewogene Mannschaften??? Spiele- und Multimedia-Programmierung 4
P Probleme mit VLCJ Spiele- und Multimedia-Programmierung 0
F Probleme bei der Soundwiedergabe Spiele- und Multimedia-Programmierung 0
S Probleme bei Breakout - Brick kollision Spiele- und Multimedia-Programmierung 2
S 2D-Render Probleme LWJGL 2 (Java) Spiele- und Multimedia-Programmierung 1
F BlueJ Ufospiel Probleme Spiele- und Multimedia-Programmierung 1
B Probleme mit AndEngine in Android Spiele- und Multimedia-Programmierung 1
M 2048, 3 kleine Probleme Spiele- und Multimedia-Programmierung 4
A Probleme mit Darstellung von Umgebungen mittels mehrdimensionaler Arrays Spiele- und Multimedia-Programmierung 8
J Java Game performance Probleme Spiele- und Multimedia-Programmierung 7
J Perfomance Probleme beim eigenen Editor Spiele- und Multimedia-Programmierung 1
K Probleme beim kompilieren von javakara Spiele- und Multimedia-Programmierung 10
Q LWJGL - Alpha-Probleme Spiele- und Multimedia-Programmierung 2
K Probleme mit .jar Spiele- und Multimedia-Programmierung 12
L Probleme beim kompilieren von javakara Spiele- und Multimedia-Programmierung 3
D Probleme mit der Runnable jar Datei Spiele- und Multimedia-Programmierung 3
D Probleme mit objekt initializirung mit Mouselistener Spiele- und Multimedia-Programmierung 10
Black_ixx Hintergrund & Koordinaten Probleme Spiele- und Multimedia-Programmierung 2
B Probleme mit Texturen Spiele- und Multimedia-Programmierung 7
Maxim6394 Probleme bei Sidescroller Spiele- und Multimedia-Programmierung 5
R Probleme mit JPanel!KeyListener geht nicht Spiele- und Multimedia-Programmierung 6
Maxim6394 [Java3D] Probleme bei Kollision Spiele- und Multimedia-Programmierung 7
Maxim6394 [Java3D] Probleme mit KeyFrame Animationen Spiele- und Multimedia-Programmierung 9
T Probleme mit Skysphere in Opengl Spiele- und Multimedia-Programmierung 4
B Probleme mit redraw() Spiele- und Multimedia-Programmierung 3
Gossi Quaxlis 2D Tutorial....Probleme nach hinzufügen der Kollisionsabfrage Spiele- und Multimedia-Programmierung 16
Gossi Probleme beim Laden der Images aus dem "Tutorial für Java-Spiele" Spiele- und Multimedia-Programmierung 4
S Probleme mit Tutorial Spiele- und Multimedia-Programmierung 3
T Probleme mit AffineTransform Spiele- und Multimedia-Programmierung 13
W Probleme mit Mouselook Spiele- und Multimedia-Programmierung 2
B GameGrid Probleme mit mehrere Actors Spiele- und Multimedia-Programmierung 5
B GameGrid Probleme mit mehrere Actors Spiele- und Multimedia-Programmierung 2
M [Spiel] Kartenspiel Leben und Tod Tips und Probleme Spiele- und Multimedia-Programmierung 7
G [Java3D] Probleme bei Animation Spiele- und Multimedia-Programmierung 4
S Probleme mit JMenu in einem JFrame mit BufferStrategy Spiele- und Multimedia-Programmierung 2
Steev Probleme mit Kameraausrichtung bei ISO-Map Spiele- und Multimedia-Programmierung 3
R MediaPlayer macht Probleme Spiele- und Multimedia-Programmierung 2
N Jogl Probleme mit dem Buffer beim laden einer Textur Spiele- und Multimedia-Programmierung 2
prakdi Probleme mit Quaxlis tutorial Spiele- und Multimedia-Programmierung 5
D Java Pong Probleme Spiele- und Multimedia-Programmierung 7
T Java Sound Probleme Spiele- und Multimedia-Programmierung 8
P probleme mit key event Spiele- und Multimedia-Programmierung 11
T Bekanntes Heli Spiel -> Aber Probleme damit Spiele- und Multimedia-Programmierung 30
O Ampel - Probleme mit der Farbgebung Spiele- und Multimedia-Programmierung 16
F Probleme bei Bewegung Spiele- und Multimedia-Programmierung 7
P Probleme mit Vista und JOGL Spiele- und Multimedia-Programmierung 2
P Probleme mit Wolkenbewegung Spiele- und Multimedia-Programmierung 5
W Probleme mit dem setTextureCoordinate Spiele- und Multimedia-Programmierung 3
D Probleme beim Download von GIF-Bildern Spiele- und Multimedia-Programmierung 4
S Probleme mit dem Licht und dem KeyListener Spiele- und Multimedia-Programmierung 2
L Probleme Bei Pong Programmierung Spiele- und Multimedia-Programmierung 2
D Probleme bei ATI Karten bekannt? Spiele- und Multimedia-Programmierung 4
H Probleme bei Rotation Spiele- und Multimedia-Programmierung 9
X Probleme. Spiele- und Multimedia-Programmierung 2
E Probleme mit Kollisionserkennung ! Spiele- und Multimedia-Programmierung 2
F Probleme mit selbsterstelltem transparenten PNG Spiele- und Multimedia-Programmierung 5
S probleme mit material Spiele- und Multimedia-Programmierung 2
W Probleme beim entfernen von Childs im HauptSceneGraph Spiele- und Multimedia-Programmierung 8
N Pong - noch 2 kleinere Probleme Spiele- und Multimedia-Programmierung 16
M Probleme mit WaveFront-Object - Datei Spiele- und Multimedia-Programmierung 7
B Probleme beim zeichnen Spiele- und Multimedia-Programmierung 15
D Gomoku --- Probleme bei Instanzierung Spiele- und Multimedia-Programmierung 2
G Probleme beim installieren java 3d linux Spiele- und Multimedia-Programmierung 4
G Sound Probleme Spiele- und Multimedia-Programmierung 2
S Probleme mit Canvas! Spiele- und Multimedia-Programmierung 2
S Jump'n'Run: Probleme mit Kollision Spiele- und Multimedia-Programmierung 13
C Probleme mit Java3D (sun.awt.DrawingSurface) in Java 5 Spiele- und Multimedia-Programmierung 10
R Probleme mit Sound in Applikation. HILFE Spiele- und Multimedia-Programmierung 5
N Probleme mit View Spiele- und Multimedia-Programmierung 3
G Minecraft PlayerBot (Listener Thread für jeden Spieler?) Spiele- und Multimedia-Programmierung 3
H Exeption in thread "Thread-2" NullPointerExeption: init methode? Spiele- und Multimedia-Programmierung 25
O Thread pausieren und wieder starten Spiele- und Multimedia-Programmierung 2
kaoZ Animation in eigenen Thread auslagern..... Spiele- und Multimedia-Programmierung 1
gamebreiti Daemon Thread Spiele- und Multimedia-Programmierung 4
N JPanel Inhalt aktualisiert nach Thread.sleep nicht Spiele- und Multimedia-Programmierung 2
S Thread und jpanel-paintcomponent kombinierbar?? Spiele- und Multimedia-Programmierung 14
Kenan89 Alternative zu Thread Runnable Spiele- und Multimedia-Programmierung 2
O Universe <- show Thread Spiele- und Multimedia-Programmierung 14
Y Warum Thread für Spieleprogrammierung? Spiele- und Multimedia-Programmierung 27
C ***** bitte thread löschen *** Spiele- und Multimedia-Programmierung 3
A KeyListener - Thread Problem Spiele- und Multimedia-Programmierung 2
D Snake n+1-Thread Spiele- und Multimedia-Programmierung 2
B Applet startet, aber führt den Thread nicht aus Spiele- und Multimedia-Programmierung 7
S Ein Thread für alle Animationen oder mehrere? Spiele- und Multimedia-Programmierung 2
G Thread startet nicht im Vollbild modus Spiele- und Multimedia-Programmierung 3
E TetrisApplet Thread Hilfe Spiele- und Multimedia-Programmierung 6
Developer_X Thread in Java3D Spiele- und Multimedia-Programmierung 8
D Methode in eigenem Thread auslagern Spiele- und Multimedia-Programmierung 9
F Problem mit Thread.sleep() Spiele- und Multimedia-Programmierung 7
Tapsi Thread wartet auf Threads Spiele- und Multimedia-Programmierung 7
M Thread.sleep() problem Spiele- und Multimedia-Programmierung 10
0 Workaround für Thread.sleep()-Bug Spiele- und Multimedia-Programmierung 15
M Roundbased - Thread anhalten Spiele- und Multimedia-Programmierung 8

Ähnliche Java Themen

Neue Themen


Oben