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