[pulseaudio-discuss] asynchronous API
Max Kempter
kxam at gmx.net
Sun Jan 7 12:13:42 PST 2007
hi,
now I try to program my own applicatoin with the asynchronous API. First I used the simple-API stuff. To handle it was easy but I had some trouble with the buffers.
So I use the asynchronous API. I think it have to work but it don`t.
I only want to connect the recording stream to the playback stream.
I hope you can help me.
The comments are because first I program something like paplay (and it works).
#include <pulse/pulseaudio.h>
#include <stdio.h>
#include <string.h>
#include <sndfile.h>
static pa_sample_spec sample_spec = { .format=PA_SAMPLE_S16LE, .rate=48000, .channels=1 };
static pa_stream *stream = NULL;
static pa_stream *stream_in = NULL;
//SNDFILE *sndfile = NULL;
pa_mainloop * ml = NULL;
pa_mainloop_api * ml_api = NULL;
pa_context *context = NULL;
void * data=NULL;
size_t data_length;
void context_state_cb(pa_context *context, void *userdata);
void stream_write_cb(pa_stream *stream, size_t length, void * userdata);
void stream_read_cb(pa_stream *stream, size_t length, void * userdata);
void quit(void){
ml_api->quit(ml_api, 99);
}
int main(int argc, char * argv[]) {
int retval;
SF_INFO sfinfo;
memset(&sfinfo, 0, sizeof(SF_INFO));
//sndfile = sf_open("./EZ.WAV", SFM_READ, &sfinfo);
//sample_spec.rate = 48000;
//sample_spec.channels = 2;
ml = pa_mainloop_new();
ml_api = pa_mainloop_get_api(ml);
retval = pa_signal_init(ml_api);
context = pa_context_new(ml_api, "my_context");
pa_context_set_state_callback(context, context_state_cb, NULL);
pa_context_connect(context, NULL, 0, NULL);
pa_mainloop_run(ml, &retval);
return 0;
}
void context_state_cb(pa_context *context, void *userdata){
switch(pa_context_get_state(context)){
case PA_CONTEXT_SETTING_NAME:
fprintf(stderr, "setting name...\n");
break;
case PA_CONTEXT_UNCONNECTED:
fprintf(stderr, "unconnected!\n");
break;
case PA_CONTEXT_CONNECTING:
fprintf(stderr, "connecting...\n");
break;
case PA_CONTEXT_AUTHORIZING:
fprintf(stderr, "authorizing...\n");
break;
case PA_CONTEXT_READY:{
fprintf(stderr, "READY\n");
stream = pa_stream_new(context, "my_stream", &sample_spec, NULL);
stream_in = pa_stream_new(context, "my_in_stream", &sample_spec, NULL);
pa_stream_set_read_callback(stream_in, stream_read_cb, NULL);
pa_stream_set_write_callback(stream, stream_write_cb, NULL);
pa_stream_connect_playback(stream, NULL, NULL, 0, NULL, NULL);
pa_stream_connect_record(stream_in, NULL, NULL, 0);
break;
}
case PA_CONTEXT_FAILED:
fprintf(stderr, "failed!\n");
break;
case PA_CONTEXT_TERMINATED:
fprintf(stderr, "terminated\n");
break;
/* default:
quit();*/
}
}
void stream_write_cb(pa_stream * stream, size_t length, void * userdata){
//sf_count_t bytes;
//void * data = NULL;
if(data)
//bytes = sf_read_raw(sndfile, data, length);
//fprintf(stdout, "%i Bytes eingelesen.\n", (int)bytes);
//pa_stream_connect_record(stream, NULL, NULL, 0);
//pa_stream_peek(stream, data, &length);
pa_stream_write(stream, data, data_length, pa_xfree, 0, PA_SEEK_RELATIVE);
}
void stream_read_cb(pa_stream * stream, size_t length, void * userdata){
/*void * data = NULL;
data = pa_xmalloc(length);*/
if(!data)
data = pa_xmalloc(length);
memset(data, 0, length);
pa_stream_peek(stream, data, &length);
data_length = length;
}
--
Der GMX SmartSurfer hilft bis zu 70% Ihrer Onlinekosten zu sparen!
Ideal für Modem und ISDN: http://www.gmx.net/de/go/smartsurfer
More information about the pulseaudio-discuss
mailing list