本文整理汇总了C++中pa_stream_set_write_callback函数的典型用法代码示例。如果您正苦于以下问题:C++ pa_stream_set_write_callback函数的具体用法?C++ pa_stream_set_write_callback怎么用?C++ pa_stream_set_write_callback使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了pa_stream_set_write_callback函数的20个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的C++代码示例。
示例1: streamRequestCallback
static void streamRequestCallback(pa_stream *p, size_t nbytes, FileReader *h) {
switch (h->writeToStream(p, nbytes)) {
case FileReader::StatusOk:
break;
case FileReader::StatusEof:
pa_stream_set_write_callback(p, NULL, NULL);
pa_stream_finish_upload(p);
break;
case FileReader::StatusError:
pa_stream_set_write_callback(p, NULL, NULL);
pa_stream_disconnect(p);
break;
}
}
开发者ID:alinelena,项目名称:cameraplus,代码行数:15,代码来源:sounds.cpp
示例2: __pulseaudio_stream_write_cb
static void __pulseaudio_stream_write_cb(pa_stream *stream, size_t length, void *user_data)
{
sf_count_t read_length;
short *data;
SOUND_INFO *info = NULL;
mmf_return_if_fail(user_data);
info = (SOUND_INFO *)user_data;
_mmcam_dbg_log("START");
data = pa_xmalloc(length);
read_length = (sf_count_t)(length/pa_frame_size(&(info->sample_spec)));
if ((sf_readf_short(info->infile, data, read_length)) != read_length) {
pa_xfree(data);
return;
}
pa_stream_write(stream, data, length, pa_xfree, 0, PA_SEEK_RELATIVE);
info->sample_length -= length;
if (info->sample_length <= 0) {
pa_stream_set_write_callback(info->sample_stream, NULL, NULL);
pa_stream_finish_upload(info->sample_stream);
pa_threaded_mainloop_signal(info->pulse_mainloop, 0);
_mmcam_dbg_log("send signal DONE");
}
_mmcam_dbg_log("DONE read_length %d", read_length);
}
开发者ID:tizenorg,项目名称:framework.multimedia.libmm-camcorder,代码行数:35,代码来源:mm_camcorder_sound.c
示例3: pa_mainloop_new
int PulseAudioDriver::thread_body()
{
m_main_loop = pa_mainloop_new();
pa_mainloop_api* api = pa_mainloop_get_api(m_main_loop);
pa_io_event* ioev = api->io_new(api, m_pipe[0], PA_IO_EVENT_INPUT,
pipe_callback, this);
m_ctx = pa_context_new(api, "Hydrogen");
pa_context_set_state_callback(m_ctx, ctx_state_callback, this);
pa_context_connect(m_ctx, 0, pa_context_flags_t(0), 0);
int retval;
pa_mainloop_run(m_main_loop, &retval);
if (m_stream)
{
pa_stream_set_state_callback(m_stream, 0, 0);
pa_stream_set_write_callback(m_stream, 0, 0);
pa_stream_unref(m_stream);
m_stream = 0;
}
api->io_free(ioev);
pa_context_unref(m_ctx);
pa_mainloop_free(m_main_loop);
return retval;
}
开发者ID:AdamFf,项目名称:hydrogen,代码行数:27,代码来源:pulse_audio_driver.cpp
示例4: pa_context_get_state
void PulseAudioDriver::ctx_state_callback(pa_context* ctx, void* udata)
{
PulseAudioDriver* self = (PulseAudioDriver*)udata;
pa_context_state s = pa_context_get_state(ctx);
if (s == PA_CONTEXT_READY)
{
pa_sample_spec spec;
spec.format = PA_SAMPLE_S16LE;
spec.rate = self->m_sample_rate;
spec.channels = 2;
self->m_stream = pa_stream_new(ctx, "Hydrogen", &spec, 0);
pa_stream_set_state_callback(self->m_stream, stream_state_callback, self);
pa_stream_set_write_callback(self->m_stream, stream_write_callback, self);
pa_buffer_attr bufattr;
bufattr.fragsize = (uint32_t)-1;
bufattr.maxlength = self->m_buffer_size * 4;
bufattr.minreq = 0;
bufattr.prebuf = (uint32_t)-1;
bufattr.tlength = self->m_buffer_size * 4;
pa_stream_connect_playback(self->m_stream, 0, &bufattr, pa_stream_flags_t(0), 0, 0);
}
else if (s == PA_CONTEXT_FAILED)
pa_mainloop_quit(self->m_main_loop, 1);
}
开发者ID:AdamFf,项目名称:hydrogen,代码行数:25,代码来源:pulse_audio_driver.cpp
示例5: Close
/*****************************************************************************
* Close: close the audio device
*****************************************************************************/
static void Close ( vlc_object_t *p_this )
{
aout_instance_t *p_aout = (aout_instance_t *)p_this;
struct aout_sys_t * p_sys = p_aout->output.p_sys;
msg_Dbg(p_aout, "Pulse Close");
if(p_sys->stream){
pa_operation *o;
pa_threaded_mainloop_lock(p_sys->mainloop);
pa_stream_set_write_callback(p_sys->stream, NULL, NULL);
if((o = pa_stream_drain(p_sys->stream, success_cb, p_aout))){
while (pa_operation_get_state(o) != PA_OPERATION_DONE) {
CHECK_DEAD_GOTO(fail);
pa_threaded_mainloop_wait(p_sys->mainloop);
}
fail:
pa_operation_unref(o);
}
pa_threaded_mainloop_unlock(p_sys->mainloop);
}
uninit(p_aout);
}
开发者ID:Kafay,项目名称:vlc,代码行数:30,代码来源:pulse.c
示例6: pulse_stop_playback
static void pulse_stop_playback(ALCdevice *device) //{{{
{
pulse_data *data = device->ExtraData;
if(!data->stream)
return;
data->killNow = AL_TRUE;
if(data->thread)
{
pa_threaded_mainloop_signal(data->loop, 0);
StopThread(data->thread);
data->thread = NULL;
}
data->killNow = AL_FALSE;
pa_threaded_mainloop_lock(data->loop);
#if PA_CHECK_VERSION(0,9,15)
if(pa_stream_set_buffer_attr_callback)
pa_stream_set_buffer_attr_callback(data->stream, NULL, NULL);
#endif
pa_stream_set_moved_callback(data->stream, NULL, NULL);
pa_stream_set_write_callback(data->stream, NULL, NULL);
pa_stream_set_underflow_callback(data->stream, NULL, NULL);
pa_stream_disconnect(data->stream);
pa_stream_unref(data->stream);
data->stream = NULL;
pa_threaded_mainloop_unlock(data->loop);
} //}}}
开发者ID:siana,项目名称:2p-openal,代码行数:31,代码来源:pulseaudio.c
示例7: pulse_output_setup_stream
/**
* Create, set up and connect a context.
*
* Caller must lock the main loop.
*
* @return true on success, false on error
*/
static bool
pulse_output_setup_stream(struct pulse_output *po, const pa_sample_spec *ss,
GError **error_r)
{
assert(po != NULL);
assert(po->context != NULL);
po->stream = pa_stream_new(po->context, po->name, ss, NULL);
if (po->stream == NULL) {
g_set_error(error_r, pulse_output_quark(), 0,
"pa_stream_new() has failed: %s",
pa_strerror(pa_context_errno(po->context)));
return false;
}
#if PA_CHECK_VERSION(0,9,8)
pa_stream_set_suspended_callback(po->stream,
pulse_output_stream_suspended_cb, po);
#endif
pa_stream_set_state_callback(po->stream,
pulse_output_stream_state_cb, po);
pa_stream_set_write_callback(po->stream,
pulse_output_stream_write_cb, po);
return true;
}
开发者ID:Acidburn0zzz,项目名称:mpd,代码行数:34,代码来源:pulse_output_plugin.c
示例8: outstream_start_pa
static int outstream_start_pa(struct SoundIoPrivate *si, struct SoundIoOutStreamPrivate *os) {
struct SoundIoOutStream *outstream = &os->pub;
struct SoundIoPulseAudio *sipa = &si->backend_data.pulseaudio;
struct SoundIoOutStreamPulseAudio *ospa = &os->backend_data.pulseaudio;
pa_threaded_mainloop_lock(sipa->main_loop);
ospa->write_byte_count = pa_stream_writable_size(ospa->stream);
int frame_count = ospa->write_byte_count / outstream->bytes_per_frame;
outstream->write_callback(outstream, 0, frame_count);
pa_operation *op = pa_stream_cork(ospa->stream, false, NULL, NULL);
if (!op) {
pa_threaded_mainloop_unlock(sipa->main_loop);
return SoundIoErrorStreaming;
}
pa_operation_unref(op);
pa_stream_set_write_callback(ospa->stream, playback_stream_write_callback, os);
pa_stream_set_underflow_callback(ospa->stream, playback_stream_underflow_callback, outstream);
pa_stream_set_overflow_callback(ospa->stream, playback_stream_underflow_callback, outstream);
pa_threaded_mainloop_unlock(sipa->main_loop);
return 0;
}
开发者ID:IceDragon200,项目名称:libsoundio,代码行数:25,代码来源:pulseaudio.c
示例9: pa_threaded_mainloop_lock
static pa_stream *qpa_simple_new (
paaudio *g,
const char *name,
pa_stream_direction_t dir,
const char *dev,
const pa_sample_spec *ss,
const pa_channel_map *map,
const pa_buffer_attr *attr,
int *rerror)
{
int r;
pa_stream *stream;
pa_threaded_mainloop_lock (g->mainloop);
stream = pa_stream_new (g->context, name, ss, map);
if (!stream) {
goto fail;
}
pa_stream_set_state_callback (stream, stream_state_cb, g);
pa_stream_set_read_callback (stream, stream_request_cb, g);
pa_stream_set_write_callback (stream, stream_request_cb, g);
if (dir == PA_STREAM_PLAYBACK) {
r = pa_stream_connect_playback (stream, dev, attr,
PA_STREAM_INTERPOLATE_TIMING
#ifdef PA_STREAM_ADJUST_LATENCY
|PA_STREAM_ADJUST_LATENCY
#endif
|PA_STREAM_AUTO_TIMING_UPDATE, NULL, NULL);
} else {
r = pa_stream_connect_record (stream, dev, attr,
PA_STREAM_INTERPOLATE_TIMING
#ifdef PA_STREAM_ADJUST_LATENCY
|PA_STREAM_ADJUST_LATENCY
#endif
|PA_STREAM_AUTO_TIMING_UPDATE);
}
if (r < 0) {
goto fail;
}
pa_threaded_mainloop_unlock (g->mainloop);
return stream;
fail:
pa_threaded_mainloop_unlock (g->mainloop);
if (stream) {
pa_stream_unref (stream);
}
*rerror = pa_context_errno (g->context);
return NULL;
}
开发者ID:juanquintela,项目名称:qemu,代码行数:59,代码来源:paaudio.c
示例10: pa_mainloop_new
bool PulseAudio::init(bool)
{
pa_ml = pa_mainloop_new();
pa_mainloop_api* pa_mlapi = pa_mainloop_get_api(pa_ml);
pa_context* pa_ctx = pa_context_new(pa_mlapi, "MuseScore");
if (pa_context_connect(pa_ctx, NULL, pa_context_flags_t(0), NULL) != 0)
qDebug("PulseAudio Context Connect Failed with Error: %s", pa_strerror(pa_context_errno(pa_ctx)));
int pa_ready = 0;
pa_context_set_state_callback(pa_ctx, pa_state_cb, &pa_ready);
while (pa_ready == 0)
pa_mainloop_iterate(pa_ml, 1, NULL);
if (pa_ready == 2)
return false;
ss.rate = _sampleRate;
ss.channels = 2;
ss.format = PA_SAMPLE_FLOAT32LE;
pa_stream* playstream = pa_stream_new(pa_ctx, "Playback", &ss, NULL);
if (!playstream) {
qDebug("pa_stream_new failed");
return false;
}
pa_stream_set_write_callback(playstream, paCallback, this);
bufattr.fragsize = (uint32_t)-1;
bufattr.maxlength = FRAMES * 2 * sizeof(float);
bufattr.minreq = FRAMES * 1 * sizeof(float); // pa_usec_to_bytes(0, &ss);
bufattr.prebuf = (uint32_t)-1;
bufattr.tlength = bufattr.maxlength;
int r = pa_stream_connect_playback(playstream, NULL, &bufattr,
pa_stream_flags_t(PA_STREAM_INTERPOLATE_TIMING
| PA_STREAM_ADJUST_LATENCY
| PA_STREAM_AUTO_TIMING_UPDATE),
NULL, NULL);
if (r < 0) {
// Old pulse audio servers don't like the ADJUST_LATENCY flag, so retry without that
r = pa_stream_connect_playback(playstream, NULL, &bufattr,
pa_stream_flags_t(PA_STREAM_INTERPOLATE_TIMING
| PA_STREAM_AUTO_TIMING_UPDATE),
NULL, NULL);
}
if (r < 0) {
qDebug("pa_stream_connect_playback failed");
pa_context_disconnect(pa_ctx);
pa_context_unref(pa_ctx);
pa_mainloop_free(pa_ml);
pa_ml = 0;
return false;
}
return true;
}
开发者ID:AdrianShe,项目名称:MuseScore,代码行数:55,代码来源:pulseaudio.cpp
示例11: pa_stream_set_write_callback
JNIEXPORT void
JNICALL Java_org_jitsi_impl_neomedia_pulseaudio_PA_stream_1set_1write_1callback
(JNIEnv *env, jclass clazz, jlong s, jobject cb)
{
jweak weakCb = cb ? (*env)->NewWeakGlobalRef(env, cb) : NULL;
pa_stream_set_write_callback(
(pa_stream *) (intptr_t) s,
weakCb ? PulseAudio_streamRequestCallback : NULL,
(void *) weakCb);
}
开发者ID:DroidInteractiveSoftware,项目名称:libjitsi,代码行数:11,代码来源:org_jitsi_impl_neomedia_pulseaudio_PA.c
示例12: context_state_callback
/*
* Context state callbacks
*
* A 'context' represents the connection handle between a PulseAudio
* client and its server. It multiplexes everything in that connection
* including data streams , bi-directional commands, and events.
*/
static void context_state_callback(pa_context *context, void *userdata) {
struct context *ctx = userdata;
struct audio_file *file;
pa_stream *stream;
int ret;
assert(ctx);
assert((file = ctx->file));
switch (pa_context_get_state(context)) {
case PA_CONTEXT_AUTHORIZING:
case PA_CONTEXT_CONNECTING:
case PA_CONTEXT_SETTING_NAME:
break;
case PA_CONTEXT_READY:
out("Connection established with PulseAudio sound server");
for (int i = 0; i < 256; i++) {
stream = pa_stream_new(context, "playback stream", &file->spec, NULL);
if (!stream)
goto fail;
pa_stream_set_state_callback(stream, stream_state_callback, userdata);
pa_stream_set_write_callback(stream, stream_write_callback, userdata);
/* Connect this stream with a sink chosen by PulseAudio */
ret = pa_stream_connect_playback(stream, NULL, NULL, 0, NULL, NULL);
if (ret < 0) {
error("pa_stream_connect_playback() failed: %s",
pa_strerror(pa_context_errno(context)));
goto fail;
}
}
break;
case PA_CONTEXT_TERMINATED:
exit(EXIT_SUCCESS);
break;
case PA_CONTEXT_FAILED:
default:
error("PulseAudio context connection failure: %s",
pa_strerror(pa_context_errno(context)));
goto fail;
}
return;
fail:
quit(ctx, EXIT_FAILURE);
}
开发者ID:a-darwish,项目名称:malicious-pulseaudio-clients,代码行数:60,代码来源:kill_server_quickly_open_write_streams.c
示例13: pa_mainloop_new
bool PulseAudio::PulseInit()
{
m_pa_error = 0;
m_pa_connected = 0;
// create pulseaudio main loop and context
// also register the async state callback which is called when the connection to the pa server has changed
m_pa_ml = pa_mainloop_new();
m_pa_mlapi = pa_mainloop_get_api(m_pa_ml);
m_pa_ctx = pa_context_new(m_pa_mlapi, "dolphin-emu");
m_pa_error = pa_context_connect(m_pa_ctx, nullptr, PA_CONTEXT_NOFLAGS, nullptr);
pa_context_set_state_callback(m_pa_ctx, StateCallback, this);
// wait until we're connected to the pulseaudio server
while (m_pa_connected == 0 && m_pa_error >= 0)
m_pa_error = pa_mainloop_iterate(m_pa_ml, 1, nullptr);
if (m_pa_connected == 2 || m_pa_error < 0)
{
ERROR_LOG(AUDIO, "PulseAudio failed to initialize: %s", pa_strerror(m_pa_error));
return false;
}
// create a new audio stream with our sample format
// also connect the callbacks for this stream
pa_sample_spec ss;
ss.format = PA_SAMPLE_S16LE;
ss.channels = 2;
ss.rate = m_mixer->GetSampleRate();
m_pa_s = pa_stream_new(m_pa_ctx, "Playback", &ss, nullptr);
pa_stream_set_write_callback(m_pa_s, WriteCallback, this);
pa_stream_set_underflow_callback(m_pa_s, UnderflowCallback, this);
// connect this audio stream to the default audio playback
// limit buffersize to reduce latency
m_pa_ba.fragsize = -1;
m_pa_ba.maxlength = -1; // max buffer, so also max latency
m_pa_ba.minreq = -1; // don't read every byte, try to group them _a bit_
m_pa_ba.prebuf = -1; // start as early as possible
m_pa_ba.tlength = BUFFER_SIZE; // designed latency, only change this flag for low latency output
pa_stream_flags flags = pa_stream_flags(PA_STREAM_INTERPOLATE_TIMING | PA_STREAM_ADJUST_LATENCY | PA_STREAM_AUTO_TIMING_UPDATE);
m_pa_error = pa_stream_connect_playback(m_pa_s, nullptr, &m_pa_ba, flags, nullptr, nullptr);
if (m_pa_error < 0)
{
ERROR_LOG(AUDIO, "PulseAudio failed to initialize: %s", pa_strerror(m_pa_error));
return false;
}
INFO_LOG(AUDIO, "Pulse successfully initialized");
return true;
}
开发者ID:comex,项目名称:Dolphin-work,代码行数:51,代码来源:PulseAudioStream.cpp
示例14: tsmf_pulse_close_stream
static BOOL tsmf_pulse_close_stream(TSMFPulseAudioDevice *pulse)
{
if(!pulse->context || !pulse->stream)
return FALSE;
DEBUG_TSMF("");
pa_threaded_mainloop_lock(pulse->mainloop);
pa_stream_set_write_callback(pulse->stream, NULL, NULL);
tsmf_pulse_wait_for_operation(pulse,
pa_stream_drain(pulse->stream, tsmf_pulse_stream_success_callback, pulse));
pa_stream_disconnect(pulse->stream);
pa_stream_unref(pulse->stream);
pulse->stream = NULL;
pa_threaded_mainloop_unlock(pulse->mainloop);
return TRUE;
}
开发者ID:10084462,项目名称:FreeRDP,代码行数:15,代码来源:tsmf_pulse.c
示例15: pa_mainloop_new
bool PulseAudio::init(bool)
{
pa_ml = pa_mainloop_new();
pa_mainloop_api* pa_mlapi = pa_mainloop_get_api(pa_ml);
pa_context* pa_ctx = pa_context_new(pa_mlapi, "MuseScore");
if (pa_context_connect(pa_ctx, NULL, pa_context_flags_t(0), NULL) != 0) {
qDebug("PulseAudio Context Connect Failed with Error: %s", pa_strerror(pa_context_errno(pa_ctx)));
return false;
}
int pa_ready = 0;
pa_context_set_state_callback(pa_ctx, pa_state_cb, &pa_ready);
while (pa_ready == 0)
pa_mainloop_iterate(pa_ml, 1, NULL);
if (pa_ready == 2)
return false;
ss.rate = _sampleRate;
ss.channels = 2;
ss.format = PA_SAMPLE_FLOAT32LE;
pa_stream* playstream = pa_stream_new(pa_ctx, "Playback", &ss, NULL);
if (!playstream) {
qDebug("pa_stream_new failed: %s", pa_strerror(pa_context_errno(pa_ctx)));
return false;
}
pa_stream_set_write_callback(playstream, paCallback, this);
bufattr.fragsize = (uint32_t)-1;
bufattr.maxlength = FRAMES * 2 * sizeof(float);
bufattr.minreq = FRAMES * 1 * sizeof(float); // pa_usec_to_bytes(0, &ss);
bufattr.prebuf = (uint32_t)-1;
bufattr.tlength = bufattr.maxlength;
int r = pa_stream_connect_playback(playstream, nullptr, &bufattr,
PA_STREAM_NOFLAGS, nullptr, nullptr);
if (r < 0) {
qDebug("pa_stream_connect_playback failed");
pa_context_disconnect(pa_ctx);
pa_context_unref(pa_ctx);
pa_mainloop_free(pa_ml);
pa_ml = 0;
return false;
}
return true;
}
开发者ID:CammyVee,项目名称:MuseScore,代码行数:48,代码来源:pulseaudio.cpp
示例16: lock
AudioStream::~AudioStream()
{
PulseMainLoopLock lock(mainloop_);
pa_stream_disconnect(audiostream_);
// make sure we don't get any further callback
pa_stream_set_state_callback(audiostream_, NULL, NULL);
pa_stream_set_write_callback(audiostream_, NULL, NULL);
pa_stream_set_read_callback(audiostream_, NULL, NULL);
pa_stream_set_moved_callback(audiostream_, NULL, NULL);
pa_stream_set_underflow_callback(audiostream_, NULL, NULL);
pa_stream_set_overflow_callback(audiostream_, NULL, NULL);
pa_stream_unref(audiostream_);
}
开发者ID:BenjaminLefoul,项目名称:ring-daemon,代码行数:16,代码来源:audiostream.cpp
示例17: pa_threaded_mainloop_lock
AudioStream::~AudioStream()
{
pa_threaded_mainloop_lock(mainloop_);
pa_stream_disconnect(audiostream_);
// make sure we don't get any further callback
pa_stream_set_state_callback(audiostream_, NULL, NULL);
pa_stream_set_write_callback(audiostream_, NULL, NULL);
pa_stream_set_underflow_callback(audiostream_, NULL, NULL);
pa_stream_set_overflow_callback(audiostream_, NULL, NULL);
pa_stream_unref(audiostream_);
pa_threaded_mainloop_unlock(mainloop_);
}
开发者ID:dyfet,项目名称:sflphone,代码行数:16,代码来源:audiostream.cpp
示例18: tsmf_pulse_close_stream
static int
tsmf_pulse_close_stream(TSMFPulseAudioDevice * pulse)
{
if (!pulse->context || !pulse->stream)
return 1;
LLOGLN(0, ("tsmf_pulse_close_stream:"));
pa_threaded_mainloop_lock(pulse->mainloop);
pa_stream_set_write_callback(pulse->stream, NULL, NULL);
tsmf_pulse_wait_for_operation(pulse,
pa_stream_drain(pulse->stream, tsmf_pulse_stream_success_callback, pulse));
pa_stream_disconnect(pulse->stream);
pa_stream_unref(pulse->stream);
pulse->stream = NULL;
pa_threaded_mainloop_unlock(pulse->mainloop);
return 0;
}
开发者ID:FreeRDP,项目名称:FreeRDP-old,代码行数:16,代码来源:tsmf_pulse.c
示例19: start_drain
/* Start draining */
static void start_drain(void) {
if (stream) {
pa_operation *o;
pa_stream_set_write_callback(stream, NULL, NULL);
if (!(o = pa_stream_drain(stream, stream_drain_complete, NULL))) {
pa_log(_("pa_stream_drain(): %s"), pa_strerror(pa_context_errno(context)));
quit(1);
return;
}
pa_operation_unref(o);
} else
quit(0);
}
开发者ID:almosthappy4u,项目名称:PulseAudio-UCM,代码行数:18,代码来源:pacat.c
示例20: pulse_output_delete_stream
/**
* Frees and clears the stream.
*/
static void
pulse_output_delete_stream(struct pulse_output *po)
{
assert(po != NULL);
assert(po->stream != NULL);
#if PA_CHECK_VERSION(0,9,8)
pa_stream_set_suspended_callback(po->stream, NULL, NULL);
#endif
pa_stream_set_state_callback(po->stream, NULL, NULL);
pa_stream_set_write_callback(po->stream, NULL, NULL);
pa_stream_disconnect(po->stream);
pa_stream_unref(po->stream);
po->stream = NULL;
}
开发者ID:Acidburn0zzz,项目名称:mpd,代码行数:20,代码来源:pulse_output_plugin.c
注:本文中的pa_stream_set_write_callback函数示例由纯净天空整理自Github/MSDocs等源码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。 |
请发表评论