/*
* AlsaPcm.java
*
* This file is part of Tritonus: http://www.tritonus.org/
*/
/*
* Copyright (c) 2000 - 2001 by Matthias Pfisterer
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU Library General Public License as published
* by the Free Software Foundation; either version 2 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 Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
/*
|<--- this code is formatted to fit into 80 columns --->|
*/
package org.tritonus.lowlevel.alsa;
import org.tritonus.share.TDebug;
/** TODO:
*/
public class AlsaPcm
{
public static final int SND_PCM_STREAM_PLAYBACK = 0;
/** Capture stream */
public static final int SND_PCM_STREAM_CAPTURE = 1;
/** PCM access type */
/* snd_pcm_access_t */
/** mmap access with simple interleaved channels */
public static final int SND_PCM_ACCESS_MMAP_INTERLEAVED = 0;
/** mmap access with simple non interleaved channels */
public static final int SND_PCM_ACCESS_MMAP_NONINTERLEAVED = 1;
/** mmap access with complex placement */
public static final int SND_PCM_ACCESS_MMAP_COMPLEX = 2;
/** snd_pcm_readi/snd_pcm_writei access */
public static final int SND_PCM_ACCESS_RW_INTERLEAVED = 3;
/** snd_pcm_readn/snd_pcm_writen access */
public static final int SND_PCM_ACCESS_RW_NONINTERLEAVED = 4;
public static final int SND_PCM_FORMAT_UNKNOWN = -1;
public static final int SND_PCM_FORMAT_S8 = 0;
public static final int SND_PCM_FORMAT_U8 = 1;
public static final int SND_PCM_FORMAT_S16_LE = 2;
public static final int SND_PCM_FORMAT_S16_BE = 3;
public static final int SND_PCM_FORMAT_U16_LE = 4;
public static final int SND_PCM_FORMAT_U16_BE = 5;
public static final int SND_PCM_FORMAT_S24_LE = 6; /* low three bytes */
public static final int SND_PCM_FORMAT_S24_BE = 7; /* low three bytes */
public static final int SND_PCM_FORMAT_U24_LE = 8; /* low three bytes */
public static final int SND_PCM_FORMAT_U24_BE = 9; /* low three bytes */
public static final int SND_PCM_FORMAT_S32_LE = 10;
public static final int SND_PCM_FORMAT_S32_BE = 11;
public static final int SND_PCM_FORMAT_U32_LE = 12;
public static final int SND_PCM_FORMAT_U32_BE = 13;
public static final int SND_PCM_FORMAT_FLOAT_LE = 14; /* 4-byte float, IEEE-754 32-bit */
public static final int SND_PCM_FORMAT_FLOAT_BE = 15; /* 4-byte float, IEEE-754 32-bit */
public static final int SND_PCM_FORMAT_FLOAT64_LE = 16; /* 8-byte float, IEEE-754 64-bit */
public static final int SND_PCM_FORMAT_FLOAT64_BE = 17; /* 8-byte float, IEEE-754 64-bit */
public static final int SND_PCM_FORMAT_IEC958_SUBFRAME_LE = 18; /* IEC-958 subframe, Little Endian */
public static final int SND_PCM_FORMAT_IEC958_SUBFRAME_BE = 19; /* IEC-958 subframe, Big Endian */
public static final int SND_PCM_FORMAT_MU_LAW = 20;
public static final int SND_PCM_FORMAT_A_LAW = 21;
public static final int SND_PCM_FORMAT_IMA_ADPCM = 22;
public static final int SND_PCM_FORMAT_MPEG = 23;
public static final int SND_PCM_FORMAT_GSM = 24;
public static final int SND_PCM_FORMAT_SPECIAL = 31;
// currently missing: cpu endianedd formats
/*
#ifdef SND_LITTLE_ENDIAN
public static final int SND_PCM_SFMT_S16 = SND_PCM_SFMT_S16_LE
public static final int SND_PCM_SFMT_U16 SND_PCM_SFMT_U16_LE
public static final int SND_PCM_SFMT_S24 SND_PCM_SFMT_S24_LE
public static final int SND_PCM_SFMT_U24 SND_PCM_SFMT_U24_LE
public static final int SND_PCM_SFMT_S32 SND_PCM_SFMT_S32_LE
public static final int SND_PCM_SFMT_U32 SND_PCM_SFMT_U32_LE
public static final int SND_PCM_SFMT_FLOAT SND_PCM_SFMT_FLOAT_LE
public static final int SND_PCM_SFMT_FLOAT64 SND_PCM_SFMT_FLOAT64_LE
public static final int SND_PCM_SFMT_IEC958_SUBFRAME SND_PCM_SFMT_IEC958_SUBFRAME_LE
#endif
#ifdef SND_BIG_ENDIAN
public static final int SND_PCM_SFMT_S16 SND_PCM_SFMT_S16_BE
public static final int SND_PCM_SFMT_U16 SND_PCM_SFMT_U16_BE
public static final int SND_PCM_SFMT_S24 SND_PCM_SFMT_S24_BE
public static final int SND_PCM_SFMT_U24 SND_PCM_SFMT_U24_BE
public static final int SND_PCM_SFMT_S32 SND_PCM_SFMT_S32_BE
public static final int SND_PCM_SFMT_U32 SND_PCM_SFMT_U32_BE
public static final int SND_PCM_SFMT_FLOAT SND_PCM_SFMT_FLOAT_BE
public static final int SND_PCM_SFMT_FLOAT64 SND_PCM_SFMT_FLOAT64_BE
public static final int SND_PCM_SFMT_IEC958_SUBFRAME SND_PCM_SFMT_IEC958_SUBFRAME_BE
#endif
*/
/*
#ifdef SND_LITTLE_ENDIAN
public static final int SND_PCM_FMT_S16 = SND_PCM_FMT_S16_LE
public static final int SND_PCM_FMT_U16 SND_PCM_FMT_U16_LE
public static final int SND_PCM_FMT_S24 SND_PCM_FMT_S24_LE
public static final int SND_PCM_FMT_U24 SND_PCM_FMT_U24_LE
public static final int SND_PCM_FMT_S32 SND_PCM_FMT_S32_LE
public static final int SND_PCM_FMT_U32 SND_PCM_FMT_U32_LE
public static final int SND_PCM_FMT_FLOAT SND_PCM_FMT_FLOAT_LE
public static final int SND_PCM_FMT_FLOAT64 SND_PCM_FMT_FLOAT64_LE
public static final int SND_PCM_FMT_IEC958_SUBFRAME SND_PCM_FMT_IEC958_SUBFRAME_LE
#endif
#ifdef SND_BIG_ENDIAN
public static final int SND_PCM_FMT_S16 SND_PCM_FMT_S16_BE
public static final int SND_PCM_FMT_U16 SND_PCM_FMT_U16_BE
public static final int SND_PCM_FMT_S24 SND_PCM_FMT_S24_BE
public static final int SND_PCM_FMT_U24 SND_PCM_FMT_U24_BE
public static final int SND_PCM_FMT_S32 SND_PCM_FMT_S32_BE
public static final int SND_PCM_FMT_U32 SND_PCM_FMT_U32_BE
public static final int SND_PCM_FMT_FLOAT SND_PCM_FMT_FLOAT_BE
public static final int SND_PCM_FMT_FLOAT64 SND_PCM_FMT_FLOAT64_BE
public static final int SND_PCM_FMT_IEC958_SUBFRAME SND_PCM_FMT_IEC958_SUBFRAME_BE
#endif
*/
/** PCM state (snd_pcm_state_t) */
/** Open */
public static final int SND_PCM_STATE_OPEN = 0;
/** Setup installed */
public static final int SND_PCM_STATE_SETUP = 1;
/** Ready to start */
public static final int SND_PCM_STATE_PREPARED = 2;
/** Running */
public static final int SND_PCM_STATE_RUNNING = 3;
/** Stopped: underrun (playback) or overrun (capture) detected */
public static final int SND_PCM_STATE_XRUN = 4;
/** Draining: running (playback) or stopped (capture) */
public static final int SND_PCM_STATE_DRAINING = 5;
/** Paused */
public static final int SND_PCM_STATE_PAUSED = 6;
/** PCM start mode (snd_pcm_start_t) */
/** Automatic start on data read/write */
public static final int SND_PCM_START_DATA = 0;
/** Explicit start */
public static final int SND_PCM_START_EXPLICIT = 1;
/** PCM xrun mode (snd_pcm_xrun_t) */
/** Xrun detection disabled */
public static final int SND_PCM_XRUN_NONE = 0;
/** Stop on xrun detection */
public static final int SND_PCM_XRUN_STOP = 1;
/** PCM timestamp mode (snd_pcm_tstamp_t) */
/** No timestamp */
public static final int SND_PCM_TSTAMP_NONE = 0;
/** Update mmap'ed timestamp */
public static final int SND_PCM_TSTAMP_MMAP = 1;
static
{
Alsa.loadNativeLibrary();
if (TDebug.TraceAlsaPcmNative)
{
setTrace(true);
}
}
/**
* Holds the pointer to snd_pcm_t for the native code.
* This must be long to be 64bit-clean.
*/
@SuppressWarnings("unused")
private long m_lNativeHandle;
/**
* For parameter documentation, see open().
*/
public AlsaPcm(String strPcmName,
int nDirection,
int nMode)
throws Exception
{
int nReturn;
nReturn = open(strPcmName,
nDirection,
nMode);
if (nReturn < 0)
{
throw new Exception(Alsa.getStringError(nReturn));
}
}
/**
* Calls snd_pcm_open().
*
* @param strPcmName An ALSA pcm name, e.g. 'hw:0,0'.
*
* @param nDirection one of SND_PCM_STREAM_PLAYBACK, SND_PCM_STREAM_CAPTURE.
*
* @param nMode optional file open modes (non-blocking,...)
*/
private native int open(String strPcmName,
int nDirection,
int nMode);
/**
* Calls snd_pcm_close().
*/
public native int close();
/**
* Calls snd_pcm_hw_params_any().
*/
public native int getAnyHWParams(AlsaPcmHWParams hwParams);
/**
* Calls snd_pcm_hw_params_set_access().
*/
public native int setHWParamsAccess(AlsaPcmHWParams hwParams, int nAccess);
/**
* Calls snd_pcm_hw_params_set_format().
*/
public native int setHWParamsFormat(AlsaPcmHWParams hwParams, int nFormat);
/**
* Calls snd_pcm_hw_params_set_format_mask().
*/
public native int setHWParamsFormatMask(AlsaPcmHWParams hwParams, AlsaPcmHWParamsFormatMask mask);
/**
* Calls snd_pcm_hw_params_set_channels().
*/
public native int setHWParamsChannels(AlsaPcmHWParams hwParams, int nChannels);
/**
* Calls snd_pcm_hw_params_set_rate_near().
*/
public native int setHWParamsRateNear(AlsaPcmHWParams hwParams, int nRate /* missing: out parameter direction? */);
/**
* Calls snd_pcm_hw_params_set_buffer_time_near().
*/
public native int setHWParamsBufferTimeNear(AlsaPcmHWParams hwParams, int nBufferTime /* missing: out parameter direction? */);
/**
* Calls snd_pcm_hw_params_set_period_time_near().
*/
public native int setHWParamsPeriodTimeNear(AlsaPcmHWParams hwParams, int nPeriodTime /* missing: out parameter direction? */);
/**
* Calls snd_pcm_hw_params().
*/
public native int setHWParams(AlsaPcmHWParams hwParams);
public native int getSWParams(AlsaPcmSWParams swParams);
public native int setSWParamsStartMode(AlsaPcmSWParams swParams, int n);
public native int setSWParamsXrunMode(AlsaPcmSWParams swParams, int n);
public native int setSWParamsTStampMode(AlsaPcmSWParams swParams, int n);
public native int setSWParamsSleepMin(AlsaPcmSWParams swParams, int n);
public native int setSWParamsAvailMin(AlsaPcmSWParams swParams, int n);
public native int setSWParamsXferAlign(AlsaPcmSWParams swParams, int n);
// TODO: should be long (snd_pcm_uframes_t)
public native int setSWParamsStartThreshold(AlsaPcmSWParams swParams, int n);
public native int setSWParamsStopThreshold(AlsaPcmSWParams swParams, int n);
public native int setSWParamsSilenceThreshold(AlsaPcmSWParams swParams, int n);
public native int setSWParamsSilenceSize(AlsaPcmSWParams swParams, int n);
public native int setSWParams(AlsaPcmSWParams swParams);
/**
@param lOffset Offset where the data should be read from
the buffer, in bytes.
@param lFrameCount Length of the data to write, in number of PCM
frames.
*/
public native long writei(byte[] abBuffer, long lOffset, long lFrameCount);
public native long readi(byte[] abBuffer, long lOffset, long lFrameCount);
public static native void setTrace(boolean bTrace);
}
/*** AlsaPcm.java ***/