Je suis en train d'implémenter une classe de pistes audio et j'ai besoin d'une bonne implémentation de buffer circulaire. J'utilise des shorts pour mes échantillons audio, donc je préférerais utiliser une classe ShortBuffer pour le buffer. Cette piste devra être thread-safe mais je peux garantir qu'un seul thread lira et un autre écrira sur la piste. Mon implémentation actuelle ressemble à ceci (elle ne gère pas le wrapping).ShortBuffer circulaire pour Audio en Java
public class Track {
//sample rate 44100, 2 channels with room for 4 seconds
private volatile ShortBuffer buffer = ShortBuffer.allocate((44100 * 2) * 4);
//keep count of the samples in the buffer
private AtomicInteger count = new AtomicInteger(0);
private ReentrantLock lock = new ReentrantLock(true);
private int readPosition = 0;
public int getSampleCount() {
int i = count.get();
return i > 0 ? i/2 : 0;
}
public short[] getSamples(int sampleCount) {
short[] samples = new short[sampleCount];
try {
lock.tryLock(10, TimeUnit.MILLISECONDS);
int writePosition = buffer.position();
buffer.position(readPosition);
buffer.get(samples);
//set new read position
readPosition = buffer.position();
// set back to write position
buffer.position(writePosition);
count.addAndGet(-sampleCount);
} catch (InterruptedException e) {
System.err.println("Exception getting samples" + e);
} finally {
if (lock.isHeldByCurrentThread()) {
lock.unlock();
}
}
return samples;
}
public void pushSamples(short[] samples) {
try {
lock.tryLock(10, TimeUnit.MILLISECONDS);
buffer.put(samples);
count.addAndGet(samples.length);
} catch (InterruptedException e) {
System.err.println("Exception getting samples" + e);
} finally {
if (lock.isHeldByCurrentThread()) {
lock.unlock();
}
}
}
}
Ceci est vraiment bon. J'utilise ceci comme un exemple pour m'aider à construire une matrice circulaire thread-safe pour les échantillons audio dans Android. Merci d'avoir posté! – chaimp
Pouvez-vous me désigner un code plus complet pour l'enregistrement dans un tampon circulaire? – stoefln