mirror of
https://github.com/DSheirer/sdrtrunk.git
synced 2026-11-12 08:37:25 -05:00
* Updates gradle to 5.1.1 * Updated to run application from intellij using installed Java 11. Resolves issues with Java 9 deprecations. * Updates gradle build dependencies and other deprecation issues. * Updates gradle to produce OS-specific builds. * Updates the beryx runtime plugin to 1.1.1 to resolve issue with zipping each of the target distributions. * Import cleanup * Resolves issue with Look and Feel error on Max OSX Resolves issue with building OSX package Resolves issue with excessive logging about JMBE library.
276 lines
7.3 KiB
Java
276 lines
7.3 KiB
Java
/*
|
|
* ******************************************************************************
|
|
* sdrtrunk
|
|
* Copyright (C) 2014-2019 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.alias.id.broadcast.BroadcastChannel;
|
|
import io.github.dsheirer.alias.id.priority.Priority;
|
|
import io.github.dsheirer.identifier.IdentifierCollection;
|
|
|
|
import java.util.ArrayList;
|
|
import java.util.Collection;
|
|
import java.util.List;
|
|
|
|
/**
|
|
* 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 float[] mAudioSamples;
|
|
|
|
private IdentifierCollection mIdentifierCollection;
|
|
private int mChannelId = 0;
|
|
private int mMonitoringPriority = Priority.DEFAULT_PRIORITY;
|
|
private boolean mRecordable = false;
|
|
private List<BroadcastChannel> mBroadcastChannels = new ArrayList<>();
|
|
|
|
/**
|
|
* 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);
|
|
}
|
|
|
|
/**
|
|
* Resets the attributes for this packet to default audio priority, non-recordable and non-streamable.
|
|
*/
|
|
public void resetAttributes()
|
|
{
|
|
mChannelId = 0;
|
|
mMonitoringPriority = Priority.DEFAULT_PRIORITY;
|
|
mRecordable = false;
|
|
mBroadcastChannels.clear();
|
|
}
|
|
|
|
/**
|
|
* Identifier for the channel that produced this audio packet. This ID is used to identify all packets
|
|
* within a packet stream that come from the same channel.
|
|
*
|
|
* @return channel identifier
|
|
*/
|
|
public int getAudioChannelId()
|
|
{
|
|
return mChannelId;
|
|
}
|
|
|
|
/**
|
|
* Sets the channel identifier for this audio packet
|
|
*
|
|
* @param channelId for this audio packet.
|
|
*/
|
|
public void setAudioChannelId(int channelId)
|
|
{
|
|
mChannelId = channelId;
|
|
}
|
|
|
|
/**
|
|
* Monitoring (ie local playback) priority.
|
|
*/
|
|
public int getMonitoringPriority()
|
|
{
|
|
return mMonitoringPriority;
|
|
}
|
|
|
|
/**
|
|
* Sets the monitoring priority
|
|
*
|
|
* @param priority for monitoring:
|
|
*
|
|
* -1 Do Not Monitor
|
|
* 0 Selected (monitor override)
|
|
* 1 Highest
|
|
* ...
|
|
* 100 Lowest
|
|
*/
|
|
public void setMonitoringPriority(int priority)
|
|
{
|
|
mMonitoringPriority = priority;
|
|
}
|
|
|
|
/**
|
|
* Indicates if the monitoring priority of this audio packet is set to do not monitor.
|
|
*/
|
|
public boolean isDoNotMonitor()
|
|
{
|
|
return mMonitoringPriority == Priority.DO_NOT_MONITOR;
|
|
}
|
|
|
|
/**
|
|
* Indicates if this audio packet should be recorded.
|
|
*/
|
|
public boolean isRecordable()
|
|
{
|
|
return mRecordable;
|
|
}
|
|
|
|
/**
|
|
* Sets the recordable status for this audio packet.
|
|
*/
|
|
public void setRecordable(boolean recordable)
|
|
{
|
|
mRecordable = recordable;
|
|
}
|
|
|
|
/**
|
|
* List of broadcast/streaming channels for this audio packet.
|
|
*/
|
|
public List<BroadcastChannel> getBroadcastChannels()
|
|
{
|
|
return mBroadcastChannels;
|
|
}
|
|
|
|
/**
|
|
* Adds the broadcast channels to this metadata
|
|
*/
|
|
public void addBroadcastChannels(Collection<BroadcastChannel> channels)
|
|
{
|
|
for(BroadcastChannel channel: channels)
|
|
{
|
|
if(!mBroadcastChannels.contains(channel))
|
|
{
|
|
mBroadcastChannels.add(channel);
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Indicates if this audio packet has one or more streaming/broadcast channels assigned.
|
|
*/
|
|
public boolean isStreamable()
|
|
{
|
|
return !mBroadcastChannels.isEmpty();
|
|
}
|
|
|
|
/**
|
|
* Indicates if this packet has associated identifier collection
|
|
*/
|
|
public boolean hasIdentifierCollection()
|
|
{
|
|
return mIdentifierCollection != null;
|
|
}
|
|
|
|
/**
|
|
* Associated audio metadata and identifiers
|
|
*/
|
|
public IdentifierCollection getIdentifierCollection()
|
|
{
|
|
return mIdentifierCollection;
|
|
}
|
|
|
|
/**
|
|
* Sets the metadata associated with this audio packet.
|
|
*/
|
|
public void setIdentifierCollection(IdentifierCollection identifierCollection)
|
|
{
|
|
mIdentifierCollection = identifierCollection;
|
|
}
|
|
|
|
/**
|
|
* 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 reusableFloatBuffer to load audio sample data from
|
|
*/
|
|
public void loadAudioFrom(ReusableFloatBuffer reusableFloatBuffer)
|
|
{
|
|
if(reusableFloatBuffer.getSamples().length != mAudioSamples.length)
|
|
{
|
|
resize(reusableFloatBuffer.getSamples().length);
|
|
}
|
|
|
|
System.arraycopy(reusableFloatBuffer.getSamples(), 0, mAudioSamples, 0, reusableFloatBuffer.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
|
|
*/
|
|
public void loadAudioFrom(float[] audio)
|
|
{
|
|
mAudioSamples = audio;
|
|
}
|
|
|
|
/**
|
|
* Audio Packet Type
|
|
*/
|
|
public enum Type
|
|
{
|
|
AUDIO,
|
|
END;
|
|
}
|
|
}
|