mirror of
https://github.com/DSheirer/sdrtrunk.git
synced 2026-11-12 08:37:25 -05:00
[WIP] Updates AudioPackets to be ReusableAudioPackets.
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user