[WIP] Updates AudioPackets to be ReusableAudioPackets.

This commit is contained in:
Denny
2018-06-29 06:53:03 -04:00
parent a621a31aa9
commit df1bc1031e
26 changed files with 451 additions and 341 deletions

View File

@@ -0,0 +1,151 @@
/*******************************************************************************
* sdr-trunk
* Copyright (C) 2014-2018 Dennis Sheirer
*
* This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public
* License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any
* later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with this program.
* If not, see <http://www.gnu.org/licenses/>
*
******************************************************************************/
package io.github.dsheirer.sample.buffer;
import io.github.dsheirer.channel.metadata.Metadata;
/**
* Reusable audio packet that carries audio sample data, associated metadata and a type to indicate if this
* packet contains audio data or is an end-audio packet.
*/
public class ReusableAudioPacket extends AbstractReusableBuffer
{
private Type mType = Type.AUDIO;
private Metadata mMetadata;
private float[] mAudioSamples;
/**
* Constructs a reusable audio packet. This constructor is package private and should only be used by
* a reusable audio packet queue.
*
* @param bufferDisposedListener to be notified when all users have released the packet
* @param length of the sample buffer
*/
ReusableAudioPacket(IReusableBufferDisposedListener bufferDisposedListener, int length)
{
super(bufferDisposedListener);
resize(length);
}
/**
* Indicates if this packet has associated metadata
*/
public boolean hasMetadata()
{
return mMetadata != null;
}
/**
* Associated audio metadata
*/
public Metadata getMetadata()
{
return mMetadata;
}
/**
* Sets the metadata associated with this audio packet.
*/
public void setMetadata(Metadata metadata)
{
mMetadata = metadata;
}
/**
* Indicates the type of audio packet
*/
public Type getType()
{
return mType;
}
/**
* Sets the type of audio packet.
*
* This method is package private and is used by the reusable audio packet queue.
*/
void setType(Type type)
{
mType = type;
}
/**
* PCM 8 kHz audio samples
*/
public float[] getAudioSamples()
{
return mAudioSamples;
}
/**
* Indicates if this audio packet contains audio samples.
*/
public boolean hasAudioSamples()
{
return mType != null && mType == Type.AUDIO && mAudioSamples != null;
}
/**
* Resizes the internal audio sample buffer.
*/
public void resize(int length)
{
if(mAudioSamples == null || mAudioSamples.length != length)
{
mAudioSamples = new float[length];
}
}
/**
* Loads a copy of the float sample data from the reusable buffer into this audio packet, resizing the
* internal audio sample buffer as necessary.
*
* @param reusableBuffer to load audio sample data from
*/
public void loadAudioFrom(ReusableBuffer reusableBuffer)
{
if(reusableBuffer.getSamples().length != mAudioSamples.length)
{
resize(reusableBuffer.getSamples().length);
}
System.arraycopy(reusableBuffer.getSamples(), 0, mAudioSamples, 0, reusableBuffer.getSamples().length);
}
/**
* Loads the audio sample array into this buffer.
*
* Note: this method is used for compatibility with legacy audio converters that have not been updated to
* use reusable audio packets and is therefore deprecated and will be removed once converters (ie JMBE) have
* been updated.
*
* @param audio to load
*/
@Deprecated
public void loadAudioFrom(float[] audio)
{
mAudioSamples = audio;
}
/**
* Audio Packet Type
*/
public enum Type
{
AUDIO,
END;
}
}

View File

@@ -0,0 +1,76 @@
/*******************************************************************************
* sdr-trunk
* Copyright (C) 2014-2018 Dennis Sheirer
*
* This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public
* License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any
* later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with this program.
* If not, see <http://www.gnu.org/licenses/>
*
******************************************************************************/
package io.github.dsheirer.sample.buffer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Queue for creating and reusing/managing reusable audio packets.
*/
public class ReusableAudioPacketQueue extends AbstractReusableBufferQueue<ReusableAudioPacket>
{
private final static Logger mLog = LoggerFactory.getLogger(ReusableAudioPacketQueue.class);
public ReusableAudioPacketQueue(String debugName)
{
super(debugName);
}
/**
* Provides a reusable buffer from an internal recycling queue, or creates a new buffer if there are currently no
* buffers available for reuse.
*
* @param size of the samples that will be loaded into the buffer
* @return a reusable buffer
*/
public ReusableAudioPacket getBuffer(int size)
{
ReusableAudioPacket buffer = getRecycledBuffer();
if(buffer == null)
{
buffer = new ReusableAudioPacket(this, size);
incrementBufferCount();
buffer.setDebugName("Owner:" + getDebugName());
mLog.debug("Buffer Created - Count:" + getBufferCount() + (getDebugName() != null ? " [" + getDebugName() + "]" : ""));
}
buffer.setType(ReusableAudioPacket.Type.AUDIO);
buffer.resize(size);
return buffer;
}
public ReusableAudioPacket getEndAudioBuffer()
{
ReusableAudioPacket buffer = getRecycledBuffer();
if(buffer == null)
{
buffer = new ReusableAudioPacket(this, 0);
incrementBufferCount();
buffer.setDebugName("Owner:" + getDebugName());
mLog.debug("Buffer Created - Count:" + getBufferCount() + (getDebugName() != null ? " [" + getDebugName() + "]" : ""));
}
buffer.setType(ReusableAudioPacket.Type.END);
return buffer;
}
}

View File

@@ -20,7 +20,7 @@ import io.github.dsheirer.sample.Listener;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class ReusableBufferBroadcaster<T extends ReusableBuffer> extends Broadcaster<T>
public class ReusableBufferBroadcaster<T extends AbstractReusableBuffer> extends Broadcaster<T>
{
private final static Logger mLog = LoggerFactory.getLogger(ReusableBufferBroadcaster.class);