📄 io.c
字号:
/**********************************************************************/
/* QCELP Variable Rate Speech Codec - Simulation of TIA IS96-A, service */
/* option one for TIA IS95, North American Wideband CDMA Digital */
/* Cellular Telephony. */
/* */
/* (C) Copyright 1993, QUALCOMM Incorporated */
/* QUALCOMM Incorporated */
/* 10555 Sorrento Valley Road */
/* San Diego, CA 92121 */
/* */
/* Note: Reproduction and use of this software for the design and */
/* development of North American Wideband CDMA Digital */
/* Cellular Telephony Standards is authorized by */
/* QUALCOMM Incorporated. QUALCOMM Incorporated does not */
/* authorize the use of this software for any other purpose. */
/* */
/* The availability of this software does not provide any license */
/* by implication, estoppel, or otherwise under any patent rights */
/* of QUALCOMM Incorporated or others covering any use of the */
/* contents herein. */
/* */
/* Any copies of this software or derivative works must include */
/* this and all other proprietary notices. */
/**********************************************************************/
/* io.c - basic file IO for raw binary files */
#include <stdio.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/file.h>
#include <sys/stat.h>
#include"struct.h"
open_binary_input_file(fin, filename)
INTTYPE *fin;
char *filename;
{
printf("Binary input file - %s\n",filename);
if( (*fin=open(filename,0))== -1) {
printf( "Error opening file - %s\n", filename);
exit(-1);
}
lseek(*fin, 0, 0);
}
open_binary_output_file(fout, filename)
INTTYPE *fout;
char *filename;
{
printf( "Binary output file - %s\n",filename);
if( ( *fout=creat(filename, 0644) )== -1) {
printf( "Error opening file - %s\n", filename);
exit(-1);
}
lseek(*fout, 0, 0);
}
/* read_samples - reads "insamples" number of samples from */
/* binary input file "fin" to float array "inbuf" */
/* The samples range from -2^15 to 2^15 -1. */
/* Shifts them into a 14 bit dynamic range */
/* Returns the number of samples read. */
INTTYPE read_samples(fin,inbuf,insamples)
INTTYPE fin;
float *inbuf;
INTTYPE insamples;
{
INTTYPE i;
INTTYPE bytes;
INTTYPE samplesread;
short swap;
short *tmpbuf;
tmpbuf=(short *)(calloc(insamples, sizeof(short)));
bytes=read(fin, (char *)tmpbuf, insamples*sizeof(short) );
samplesread=bytes/sizeof(short);
for(i=0; i<samplesread; i++){
swap =(tmpbuf[i]<<8)&0xff00;
swap|=(tmpbuf[i]>>8)&0x00ff;
*(inbuf+i)=(float)(swap)/4.0;
}
free(tmpbuf);
return(samplesread);
}
/* write_samples - writes "outsamples" number of samples from */
/* float array "outsamples" to binary output file "fout" */
/* Shifts samples up from 14 bits to 16 bits. */
/* Saturates the samples to the allowable range. */
/* Returns the number of samples written. */
INTTYPE write_samples(fout,outbuf,outsamples)
INTTYPE fout;
float *outbuf;
INTTYPE outsamples;
{
INTTYPE bytes;
INTTYPE i;
short swap;
float ftmp;
short *tmpbuf;
tmpbuf= (short *)(calloc(outsamples, sizeof(short)));
for(i=0; i<outsamples; i++ ){
ftmp=*(outbuf+i)*4.0;
ftmp=(ftmp<-32768.0)? -32768.0:ftmp;
ftmp=(ftmp> 32767.0)? 32767.0:ftmp;
swap=(short)ftmp;
tmpbuf[i] =(swap<<8)&0xff00;
tmpbuf[i]|=(swap>>8)&0x00ff;
}
if ((bytes=write(fout, (char *)tmpbuf, outsamples*sizeof(short)))
!= outsamples*sizeof(short)) {
printf( "Error writing data to output file\n" );
exit(-1);
}
free(tmpbuf);
return(bytes/sizeof(short));
}
/* read_data - reads "insamples" number of words from */
/* binary input file "fin" to int array "inbuf" */
/* Returns the number of words read. */
INTTYPE read_data(fin,inbuf,insamples)
INTTYPE fin;
INTTYPE *inbuf;
INTTYPE insamples;
{
INTTYPE i;
INTTYPE bytes;
INTTYPE samplesread;
short swap;
short *tmpbuf;
tmpbuf=(short *)(calloc(insamples, sizeof(short)));
bytes=read(fin, (char *)tmpbuf, insamples*sizeof(short) );
samplesread=bytes/sizeof(short);
for(i=0; i<samplesread; i++){
swap =(tmpbuf[i]<<8)&0xff00;
swap|=(tmpbuf[i]>>8)&0x00ff;
*(inbuf+i)=(INTTYPE)(swap)&0xffff;
}
free(tmpbuf);
return(samplesread);
}
/* write_data - writes "outsamples" number of words from */
/* int array "outsamples" to binary output file "fout" */
/* Returns the number of words written. */
INTTYPE write_data(fout,outbuf,outsamples)
INTTYPE fout;
INTTYPE *outbuf;
INTTYPE outsamples;
{
INTTYPE bytes;
INTTYPE i;
short swap;
float ftmp;
short *tmpbuf;
tmpbuf= (short *)(calloc(outsamples, sizeof(short)));
for(i=0; i<outsamples; i++ ){
swap=(short)(*(outbuf+i));
tmpbuf[i] =(swap<<8)&0xff00;
tmpbuf[i]|=(swap>>8)&0x00ff;
}
if ((bytes=write(fout, (char *)tmpbuf, outsamples*sizeof(short)))
!= outsamples*sizeof(short)) {
printf( "Error writing data to output file\n" );
exit(-1);
}
free(tmpbuf);
return(bytes/sizeof(short));
}
get_signaling_data(fn_sig, sig_ptr)
char *fn_sig;
struct SIGNAL_DATA **sig_ptr;
{
FILE *fsig;
INTTYPE frame_num, max_rate, min_rate;
struct SIGNAL_DATA *dum_sig, *dum_sig2;
INTTYPE sig_num;
if ((fsig=fopen(fn_sig, "r"))==NULL) {
printf("Error opening signaling data file\n");
exit(-1);
}
sig_num=0;
/* create a linked list of signaling commands */
while (fscanf(fsig, "%d%d%d", &frame_num, &max_rate, &min_rate)!=EOF) {
dum_sig=(struct SIGNAL_DATA *)(calloc(1, sizeof(struct SIGNAL_DATA)));
dum_sig->frame_num=frame_num;
dum_sig->max_rate =max_rate;
dum_sig->min_rate =min_rate;
if (sig_num==0) {
*sig_ptr=dum_sig;
}
else {
dum_sig2->next_sig=dum_sig;
}
dum_sig2=dum_sig;
sig_num+=1;
}
dum_sig=(struct SIGNAL_DATA *)(calloc(1, sizeof(struct SIGNAL_DATA)));
dum_sig->frame_num= -1;
dum_sig2->next_sig=dum_sig;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -