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

📄 test_codecs.c

📁 linux系统下的音频通信
💻 C
字号:
#include "config_unix.h"#include "codec_types.h"#include "codec.h"#include "util.h" /* Block alloc */#include "debug.h"static voidbuffer_fill(sample *s, int s_bytes, int channels, int freq){        int i, j, samples = s_bytes / sizeof(sample);        xmemchk();        assert(channels == 1 || channels == 2);        assert(samples > 30);        for(i = 0; i < samples; i+=channels) {                for(j = 0; j<channels; j++) {                        s[i+j] = (sample)                                (16384.0 * sin(2 * M_PI * (float)i/(float)freq));                }        }        xmemchk();}static doublesnr(sample *src, sample *replica, int s_bytes){        int i, n_samples = s_bytes / sizeof(sample);        double st = 0.0, nt = 0.0;                for(i = 0; i < n_samples; i++) {                st += fabs((double)src[i]);                nt += fabs((double)src[i] - (double)replica[i]);        }        if (nt == 0) return -100000000.0;        return -20 * (log10(st / nt));}/* This function encodes and decodes frames of audio * containing tones and produces SNR estimate. * * For codecs that are not pitch synchronous this does not * make a lot of sense with first finding max correlation score * between buffers and then realigning. */  static voidtest_codec(codec_id_t cid, const codec_format_t *cf){        codec_state *enc, *dec;        coded_unit  input, output, coded;        int success, fill_freq;        float sig_err;        success = codec_encoder_create(cid, &enc);        assert(success == 1);        success = codec_decoder_create(cid, &dec);        assert(success == 1);                /* First make buffer of raw audio */        input.id    = codec_get_native_coding(cf->format.sample_rate,                                               cf->format.channels);        input.state     = NULL;        input.state_len = 0;        input.data      = (u_char*)block_alloc(cf->format.bytes_per_block);        input.data_len  = cf->format.bytes_per_block;        for(fill_freq = 1000; fill_freq < 3500; fill_freq += 500) {                buffer_fill((sample*)input.data,                             input.data_len,                             cf->format.channels,                            fill_freq);                memset(&coded, 0, sizeof(coded_unit));                codec_encode(enc, &input, &coded);                assert(codec_peek_frame_size(coded.id,                                             coded.data,                                             1000) == coded.data_len);                                memset(&output, 0, sizeof(coded_unit));                codec_decode(dec, &coded, &output);                /* Make sure raw audio frame sizes match */                assert(input.data_len == output.data_len);                /* Do snr thing */                printf("%d\t",                        fill_freq);                sig_err = snr((sample*)input.data, (sample*)output.data, input.data_len);                printf("%d\n", (int)(sig_err));                /* Clear memory allocated by encoder */                codec_clear_coded_unit(&coded);                /* Clear memory allocated by decoder */                codec_clear_coded_unit(&output);        }        codec_clear_coded_unit(&input);        codec_encoder_destroy(&enc);        codec_decoder_destroy(&dec);}int main(){        const codec_format_t *cf;        u_int32               n_codecs, i;        codec_id_t cid;        codec_init();        n_codecs = codec_get_number_of_codecs();        for (i = 0; i < n_codecs; i++) {                cid = codec_get_codec_number(i);                assert(codec_id_is_valid(cid));                cf = codec_get_format(cid);                printf("Codec 0x%x: ",                       (unsigned)cid);                printf("%s (%s).\n",                        cf->long_name,                        cf->short_name);                printf("%s\nDefault pt (%u)\n",                       cf->description,                       cf->default_pt                       );                if (codec_can_encode(cid) && codec_can_decode(cid)) {                        test_codec(cid, cf);                } else {                        printf("*** Not tested encode(%d) decode(%d)\n",                               codec_can_encode(cid),                               codec_can_decode(cid));                }                xmemchk();        }        codec_exit();        xmemdmp();        return 1;}

⌨️ 快捷键说明

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