/*! \brief The avmd session data initialization function * @author Eric des Courtis * @param avmd_session A reference to a avmd session * @param fs_session A reference to a FreeSWITCH session */ static void init_avmd_session_data(avmd_session_t *avmd_session, switch_core_session_t *fs_session) { /*! This is a worst case sample rate estimate */ avmd_session->rate = 48000; INIT_CIRC_BUFFER(&avmd_session->b, BEEP_LEN(avmd_session->rate), FRAME_LEN(avmd_session->rate), fs_session); avmd_session->session = fs_session; avmd_session->pos = 0; avmd_session->state.last_beep = 0; avmd_session->state.beep_state = BEEP_NOTDETECTED; INIT_SMA_BUFFER( &avmd_session->sma_b, BEEP_LEN(avmd_session->rate) / SINE_LEN(avmd_session->rate), fs_session ); }
int8_t frame_get_stream(struct frames_buffer *f_buf, void *dest_buf, uint16_t len, uint8_t *data_len) { struct frame *frame_rec = &f_buf->frame_record[f_buf->tail]; uint8_t fr_type; int8_t ret, f_ret = FRAME_OK; if (f_buf->cnt == 0 && f_buf->tail == f_buf->head) { return FRAME_BUF_EMPTY; // Buffer is EMPTY } if (len < FRAME_LEN(frame_rec)) return -FRAME_ERR_NOMEM; ret = frame_decode(frame_rec, dest_buf, data_len, &fr_type); if (ret) { f_ret = ret; } else { if (fr_type == FRAME_START) { if (f_buf->start_found == 1) { f_buf->start_found = 0; return -FRAME_BRK_STREAM; } else { f_buf->start_found = 1; } } else if (fr_type == FRAME_END) { f_buf->start_found = 0; f_ret = FRAME_OK_END; } else if (fr_type == FRAME_SIMPLE) { if (f_buf->start_found == 1) { f_buf->start_found = 0; return -FRAME_BRK_STREAM; } f_ret = FRAME_OK_SIMPLE; } } FRAME_BUF_PTR_INC(f_buf->tail); f_buf->cnt--; return f_ret; }
int8_t frame_decode(struct frame *fr, void *data, uint8_t *data_len, uint8_t *type) { uint8_t data_crc = 0xff, i; *data_len = FRAME_LEN(fr); *type = FRAME_TYPE(fr); data_crc = frame_crc_calc(data_crc, fr->header); for (i = 0; i < *data_len; i++) { data_crc = frame_crc_calc(data_crc, fr->payload[i]); } if (data_crc == fr->checksum) { memcpy(data, fr->payload, *data_len); } else { return -FRAME_ERR_CRC; } return FRAME_OK; }