[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