⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 audio_translate.c

📁 lpc 2400 bps语音编解码程序
💻 C
字号:
#include <stdio.h>
#include <multimedia/libaudio.h>

#define X2C 0x10
#define X2S 0x20
#define X2L 0x30
#define X2F 0x40
#define X2D 0x50
#define X2U 0x60
#define C2X 0x100
#define S2X 0x200
#define L2X 0x300
#define F2X 0x400
#define D2X 0x500
#define U2X 0x600

/*
 * Set up audio file translation
 *   If verbose > 0, print diagnostics on stderr if translation fails
 *   return:
 *       >0 - magic cookie to be passed to audio_translate
 *        0 - output = input encoding, no translation required
 *       -1 - translation not available
 */

audio_setup_translate(in_hdr, out_hdr, verbose)
Audio_hdr	in_hdr, out_hdr;	/* Input and output encoding formats */
int		verbose;
{
	int trans = -1;
	char msg[AUDIO_MAX_ENCODE_INFO];

/* See if headers are identical */

	if (in_hdr.encoding == out_hdr.encoding &&
	    in_hdr.channels == out_hdr.channels &&
	    in_hdr.sample_rate == out_hdr.sample_rate &&
	    in_hdr.bytes_per_unit == out_hdr.bytes_per_unit &&
	    in_hdr.samples_per_unit == out_hdr.samples_per_unit) return 0;

/* Check for valid samples_per_unit and channels */

	if ((in_hdr.samples_per_unit != 1) || (out_hdr.samples_per_unit != 1))
	    return(-1);
	if (in_hdr.channels != out_hdr.channels)
	    return(-1);

/* Determine input encoding format */

	switch (in_hdr.encoding) {
	    case AUDIO_ENCODING_ULAW:
		switch (in_hdr.bytes_per_unit) {
		    case sizeof(char): trans = U2X; break;
		}
		break;
	    case AUDIO_ENCODING_LINEAR:
		switch (in_hdr.bytes_per_unit) {
		    case sizeof(char):   trans = C2X; break;
		    case sizeof(short):  trans = S2X; break;
		    case sizeof(long):   trans = L2X; break;
		}
		break;
	    case AUDIO_ENCODING_FLOAT:
		switch (in_hdr.bytes_per_unit) {
		    case sizeof(float):  trans = F2X; break;
		    case sizeof(double): trans = D2X; break;
		}
		break;
	}

/* Punt if input encoding not recognized */

	if (trans > 0) {

/* Determine output encoding format */

	    switch (out_hdr.encoding) {
	    case AUDIO_ENCODING_ULAW:
		switch (out_hdr.bytes_per_unit) {
		    case sizeof(char): trans |= X2U; break;
		}
		break;
	    case AUDIO_ENCODING_LINEAR:
		switch (out_hdr.bytes_per_unit) {
		    case sizeof(char):   trans |= X2C; break;
		    case sizeof(short):  trans |= X2S; break;
		    case sizeof(long):   trans |= X2L; break;
		}
		break;
	    case AUDIO_ENCODING_FLOAT:
		switch (out_hdr.bytes_per_unit) {
		    case sizeof(float):  trans |= X2F; break;
		    case sizeof(double): trans |= X2D; break;
		}
		break;
	    }
	}

/* Return complete format translation cookie */

	if (trans < 0 && verbose > 0) {
	    audio_enc_to_str(&in_hdr, msg);
	    fprintf(stderr, "can't convert from: %s\n", msg);
	    audio_enc_to_str(&out_hdr, msg);
	    fprintf(stderr, "                to: %s\n", msg);
	}
	return(trans);
}

/*
 *  Translate cnt bytes from ibuf to obuf, return output byte count
 */

audio_translate(trans, ibuf, obuf, cnt)	/* Return value = output byte count */
    int	trans;		/* Magic cookie from 'audio_setup_translate' */
    int	cnt;		/* Input byte count */
    void *ibuf, *obuf;	/* Input and output buffers of indeterminate type */
{
   /* Initialize buffer pointers of various types */

	unsigned char *i_u = (unsigned char *)ibuf;
	unsigned char *o_u = (unsigned char *)obuf;
	char   *i_c =   (char *)ibuf, *o_c =   (char *)obuf;
	short  *i_s =  (short *)ibuf, *o_s =  (short *)obuf;
	long   *i_l =   (long *)ibuf, *o_l =   (long *)obuf;
	float  *i_f =  (float *)ibuf, *o_f =  (float *)obuf;
	double *i_d = (double *)ibuf, *o_d = (double *)obuf;

	int i, n;

	switch (trans) {
	    case L2X|X2U: { n = cnt/sizeof(long);
		for(i=0; i<n; i++) *o_u++ = audio_l2u(*i_l++);
		n = n*sizeof(char); break; }
	    case S2X|X2U: { n = cnt/sizeof(short);
		for(i=0; i<n; i++) *o_u++ = audio_s2u(*i_s++);
		n = n*sizeof(char); break; }
	    case C2X|X2U: { n = cnt/sizeof(char);
		for(i=0; i<n; i++) *o_u++ = audio_l2u(*i_c++);
		n = n*sizeof(char); break; }
	    case U2X|X2L: { n = cnt/sizeof(char);
		for(i=0; i<n; i++) *o_l++ = audio_u2l(*i_u++);
		n = n*sizeof(long); break; }
	    case U2X|X2S: { n = cnt/sizeof(char);
		for(i=0; i<n; i++) *o_s++ = audio_u2s(*i_u++);
		n = n*sizeof(short); break; }
	    case U2X|X2C: { n = cnt/sizeof(char);
		for(i=0; i<n; i++) *o_c++ = audio_u2c(*i_u++);
		n = n*sizeof(char); break; }
	    default:
		return(-1);
	}
	return(n);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -