/** * Read samples from Audio Source * * @note This function has REAL-TIME properties * * @note This function may be called from any thread */ static void ausrc_read_handler(const uint8_t *buf, size_t sz, void *arg) { struct audio *a = arg; struct autx *tx = &a->tx; uint8_t *silence = NULL; const uint8_t *txbuf = buf; /* NOTE: * some devices behave strangely if they receive no RTP, * so we send silence when muted */ if (tx->muted) { silence = mem_zalloc(sizeof(*silence) * sz, NULL); txbuf = silence; } if (tx->ab) { if (aubuf_write(tx->ab, txbuf, sz)) goto out; /* XXX: on limited CPU and specifically coreaudio module * calling this procedure, which results in audio encoding, * seems to have an overall negative impact on system * performance! (coming from interrupt context?) */ if (a->cfg.txmode == AUDIO_MODE_POLL) poll_aubuf_tx(a); } out: /* Exact timing: send Telephony-Events from here */ check_telev(a, tx); mem_deref(silence); }
/* Expected format: 16-bit signed PCM */ static void packet_handler(struct ausrc_st *st, GstBuffer *buffer) { int err; if (!st->run) return; /* NOTE: When streaming from files, the buffer will be filled up * pretty quickly.. */ err = aubuf_write(st->aubuf, GST_BUFFER_DATA(buffer), GST_BUFFER_SIZE(buffer)); if (err) { DEBUG_WARNING("aubuf_write: %m\n", err); } /* Empty buffer now */ while (st->run) { const struct timespec delay = {0, st->ptime*1000000/2}; play_packet(st); if (aubuf_cur_size(st->aubuf) < st->psize) break; (void)nanosleep(&delay, NULL); } }
static void read_handler(const void *sampv, size_t sampc, void *arg) { struct audio_loop *al = arg; size_t num_bytes = sampc * aufmt_sample_size(al->fmt); int err; al->n_read += sampc; err = aubuf_write(al->aubuf, sampv, num_bytes); if (err) { warning("auloop: aubuf_write: %m\n", err); } }
static void read_handler(const uint8_t *buf, size_t sz, void *arg) { struct audio_loop *al = arg; int err; ++al->n_read; err = aubuf_write(al->ab, buf, sz); if (err) { DEBUG_WARNING("aubuf_write: %m\n", err); } print_stats(al); }
/** * Read samples from Audio Source * * @note This function has REAL-TIME properties * * @note This function may be called from any thread */ static void ausrc_read_handler(const uint8_t *buf, size_t sz, void *arg) { struct audio *a = arg; struct autx *tx = &a->tx; if (tx->muted) { memset((void *)buf, 0, sz); } aubuf_write(tx->ab, buf, sz); if (a->cfg.txmode == AUDIO_MODE_POLL) { poll_aubuf_tx(a); } /* Exact timing: send Telephony-Events from here */ check_telev(a, tx); }
/* Expected format: 16-bit signed PCM */ static void packet_handler(struct ausrc_st *st, GstBuffer *buffer) { GstMapInfo info; int err; if (!st->run) return; /* NOTE: When streaming from files, the buffer will be filled up * pretty quickly.. */ if (!gst_buffer_map(buffer, &info, GST_MAP_READ)) { warning("gst: gst_buffer_map failed\n"); return; } err = aubuf_write(st->aubuf, info.data, info.size); if (err) { warning("gst: aubuf_write: %m\n", err); } gst_buffer_unmap(buffer, &info); /* Empty buffer now */ while (st->run) { const struct timespec delay = {0, st->prm.ptime*1000000/2}; play_packet(st); if (aubuf_cur_size(st->aubuf) < st->psize) break; (void)nanosleep(&delay, NULL); } }