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

📄 test_convert.c

📁 linux系统下的音频通信
💻 C
字号:
/* test_convert [-list] -c <n> -ifmt <fmt1> -ofmt <fmt2> *//* Where :   -list  lists converters.   -c <n> selects converter n    and <fmt> has form rate=8000,channels=1 */#include "config_unix.h"#include "config_win32.h"#include "debug.h"#include "memory.h"#include "util.h"#include "audio_types.h"#include "codec_types.h"#include "codec.h"#include "converter_types.h"#include "converter.h"static intlist_converters(){        const converter_details_t *cd;        int i, n;        n = converter_get_count();        for(i = 0; i < n; i++) {                cd = converter_get_details(i);                printf("%d %s\n", i, cd->name);        }        fflush(stdout);        exit(-1);}static voidusage(){	printf("test_convert [-list] -c <n> -ifmt <fmt> -ofmt <ofmt>\n"\	       "where:\n\t-list\t lists converters.\n" \	       "\t-c <n> \t selects converter n\n" \	       "\tand formats are of form \"rate=8000,channels=1\n");        exit(-1);}static char* get_token(char *name, char *src, int src_len){        char *cur;        int cur_len, done;        done = 0;        cur  = src;        while (done < src_len) {                cur_len = strlen(cur);                if (!strcmp(cur, name) && done + cur_len + 1 < src_len) {                        return cur + cur_len + 1;                }                cur += cur_len + 1;        }        return NULL;}static intparse_fmt(char *fmt, uint16_t *channels, uint16_t *rate){        char *f;        int fmtlen;        int found = 0;        if (fmt == NULL) {                return FALSE;        }        fmtlen = strlen(fmt);        f = fmt;        while(*f) {                if (*f ==',' || *f == '=') {                        *f = 0;                }                f++;        }        f = get_token("rate", fmt, fmtlen);        if (f != NULL) {                *rate = (uint16_t)(atoi(f));                found++;        }        f = get_token("channels", fmt, fmtlen);        if (f != NULL) {                *channels = (uint16_t)(atoi(f));                found++;        }        return (found==2);}static voiddump_frame(coded_unit *cu, int offset){        uint16_t rate, channels;        sample *src;        int i, j, n;        codec_get_native_info( cu->id, &rate, &channels);        src = (sample*)cu->data;        n = cu->data_len / (sizeof(sample) * channels);        for (i = 0; i < n; i++) {                printf("%.4f ", (double)(i + offset) * 1000.0/(double)rate);                for(j = 0; j < channels; j++) {                        printf("%d ", src[i*channels+j]);                }                printf("\n");        }        printf("\n");}#define TEST_FRAME_LEN 160#define TEST_FRAMES    8static inttest_converter(int idx, converter_fmt_t *cf){        struct s_converter *c;        const converter_details_t *cd;        sample *src;        coded_unit cu_in, cu_out;        int i, j, n;        n = converter_get_count();        if (idx < 0 || idx > n) {                fprintf(stderr, "Converter index out of range\n");                return FALSE;        }        cd = converter_get_details(idx);        printf("#Using %s\n", cd->name);        if (converter_create(cd->id, cf, &c) == FALSE) {                fprintf(stderr, "Could not create converter\n");                return FALSE;        }        /* Allocate and initialize source buffer */        src = (sample*)xmalloc(TEST_FRAME_LEN * TEST_FRAMES * cf->src_channels * sizeof(sample));        for(i = 0; i < TEST_FRAME_LEN * TEST_FRAMES; i++) {                for(j = 0; j < cf->src_channels; j++) {                        src[i * cf->src_channels + j] = 16384 *                                 sin(64 *1000 * M_PI * i / (cf->src_freq * TEST_FRAME_LEN)) *                                 cos(16 *M_PI * i * 1000 / (TEST_FRAME_LEN * cf->src_freq));                }        }        memset(&cu_in, 0, sizeof(cu_in));        memset(&cu_out, 0, sizeof(cu_out));        for(i = 0; i < TEST_FRAMES; i++) {                cu_in.id       = codec_get_native_coding(cf->src_freq, cf->src_channels);                cu_in.data     = (u_char*)(src + cf->src_channels * TEST_FRAME_LEN * i);                cu_in.data_len = cf->src_channels * TEST_FRAME_LEN * sizeof(sample);                dump_frame(&cu_in, i * TEST_FRAME_LEN);                converter_process(c, &cu_in, &cu_out);                dump_frame(&cu_out, i * TEST_FRAME_LEN * cf->dst_freq / cf->src_freq);                block_free(cu_out.data, cu_out.data_len);                cu_out.data     = 0;                cu_out.data_len = 0;        }        converter_destroy(&c);        return TRUE;}int main(int argc, char *argv[]){        int i;        int idx;        converter_fmt_t cf;        converters_init();        if (argc == 1) {                usage();        }                i = 1;        while(i < argc) {                switch(argv[i][1]) {                case 'h':                case '?':                        usage();                        break;                case 'l':                        list_converters();                        break;                case 'c':                        idx = atoi(argv[i+1]);                        i+=2;                        break;                case 'i':                        if (parse_fmt(argv[i+1], &cf.src_channels, &cf.src_freq) == FALSE) {                                usage();                        }                        i+=2;                        break;                case 'o':                              if (parse_fmt(argv[i+1], &cf.dst_channels, &cf.dst_freq) == FALSE) {                                usage();                        }                        i+=2;                        break;                }        }        test_converter(idx, &cf);        converters_free();        return 0;}

⌨️ 快捷键说明

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