/** * Pulseaudio callback when new data is available. */ static void stream_read_callback (pa_stream * s, size_t length, void *userdata) { const void *data; GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Got %u/%u bytes of PCM data\n", length, pcm_length); GNUNET_assert (NULL != s); GNUNET_assert (length > 0); if (stdio_event) mainloop_api->io_enable (stdio_event, PA_IO_EVENT_OUTPUT); if (pa_stream_peek (s, (const void **) &data, &length) < 0) { GNUNET_log (GNUNET_ERROR_TYPE_ERROR, _("pa_stream_peek() failed: %s\n"), pa_strerror (pa_context_errno (context))); quit (1); return; } GNUNET_assert (NULL != data); GNUNET_assert (length > 0); if (NULL != transmit_buffer) { transmit_buffer = pa_xrealloc (transmit_buffer, transmit_buffer_length + length); memcpy (&transmit_buffer[transmit_buffer_length], data, length); transmit_buffer_length += length; } else { transmit_buffer = pa_xmalloc (length); memcpy (transmit_buffer, data, length); transmit_buffer_length = length; transmit_buffer_index = 0; } pa_stream_drop (s); packetizer (); }
channel_ptr channel_builder::build( void ) { static channel_deleter deleter; channel* chan = nullptr; do { codex::threading::lock_guard< codex::threading::mutex > guard(_lock); if ( !_channels.empty() ) { chan = _channels.back(); _channels.pop_back(); } } while (0); if (chan== nullptr ) { chan = new channel(); } chan->add_ref(); channel_ptr ptr( chan , deleter ); ptr->set_builder( this ); ptr->set_loop( &loop()); ptr->set_packetizer( packetizer()); auto handler0 = handler(); handler0->channel_ptr(ptr); ptr->set_handler( handler0 ); return ptr; }