#include #include #include #include #include #include #include "core.h" #include "util.h" ECPContext ctx_c; ECPSocket sock_c; ECPConnHandler handler_c; ECPNode node; ECPConnection conn; int open_done = 0; snd_pcm_t *handle_plb; snd_pcm_t *handle_cpt; OpusEncoder *opus_enc; OpusDecoder *opus_dec; // 2.5, 5, 10, 20, 40 or 60 ms snd_pcm_uframes_t alsa_frames = 160; unsigned char *alsa_out_buf = NULL; unsigned char *alsa_in_buf = NULL; #define CTYPE_TEST 0 #define MTYPE_MSG 8 int a_open(char *dev_name, snd_pcm_t **handle, snd_pcm_hw_params_t **hw_params, snd_pcm_stream_t stream, snd_pcm_format_t format, unsigned int *nchannels, unsigned int *sample_rate, snd_pcm_uframes_t *frames, size_t *buf_size) { int bits, err = 0; unsigned int fragments = 2; unsigned int frame_size; err = snd_pcm_open(handle, dev_name, stream, 0); if (!err) err = snd_pcm_hw_params_malloc(hw_params); if (!err) err = snd_pcm_hw_params_any(*handle, *hw_params); if (!err) err = snd_pcm_hw_params_set_access(*handle, *hw_params, SND_PCM_ACCESS_RW_INTERLEAVED); if (!err) err = snd_pcm_hw_params_set_format(*handle, *hw_params, format); if (!err) err = snd_pcm_hw_params_set_rate_near(*handle, *hw_params, sample_rate, 0); if (!err) err = snd_pcm_hw_params_set_channels_near(*handle, *hw_params, nchannels); if (!err) err = snd_pcm_hw_params_set_periods_near(*handle, *hw_params, &fragments, 0); if (!err) err = snd_pcm_hw_params_set_period_size_near(*handle, *hw_params, frames, 0); if (!err) err = snd_pcm_hw_params(*handle, *hw_params); if (err) return err; bits = snd_pcm_hw_params_get_sbits(*hw_params); if (bits < 0) return bits; frame_size = *nchannels * (bits / 8); *buf_size = frame_size * *frames; return ECP_OK; } int a_prepare(snd_pcm_t *handle, snd_pcm_hw_params_t *hw_params, unsigned char *buf, snd_pcm_uframes_t frames) { snd_pcm_drop(handle); snd_pcm_prepare(handle); if (snd_pcm_stream(handle) == SND_PCM_STREAM_PLAYBACK) { int i, err; unsigned int fragments; err = snd_pcm_hw_params_get_periods(hw_params, &fragments, NULL); if (err) return err; for (i=0; i\n", arg); exit(1); } int main(int argc, char *argv[]) { int rv; if (argc != 2) usage(argv[0]); rv = ecp_init(&ctx_c); printf("ecp_init RV:%d\n", rv); rv = ecp_conn_handler_init(&handler_c); handler_c.msg[ECP_MTYPE_OPEN] = handle_open_c; handler_c.msg[MTYPE_MSG] = handle_msg_c; ctx_c.handler[CTYPE_TEST] = &handler_c; rv = ecp_sock_create(&sock_c, &ctx_c, NULL); printf("ecp_sock_create RV:%d\n", rv); rv = ecp_sock_open(&sock_c, NULL); printf("ecp_sock_open RV:%d\n", rv); rv = ecp_start_receiver(&sock_c); printf("ecp_start_receiver RV:%d\n", rv); rv = ecp_util_node_load(&ctx_c, &node, argv[1]); printf("ecp_util_node_load RV:%d\n", rv); rv = ecp_conn_create(&conn, &sock_c, CTYPE_TEST); printf("ecp_conn_create RV:%d\n", rv); rv = ecp_conn_open(&conn, &node); printf("ecp_conn_open RV:%d\n", rv); while(!open_done) sleep(1); unsigned char payload[ECP_MAX_PLD]; unsigned char *opus_buf; while(1) { ecp_pld_set_type(payload, MTYPE_MSG); opus_buf = ecp_pld_get_buf(payload, 0); opus_int32 len = a_read(handle_cpt, alsa_in_buf, alsa_frames, opus_enc, opus_buf, ECP_MAX_MSG); if (len < 0) continue; ssize_t _rv = ecp_send(&conn, payload, len); } }