0

I'm new with PulseAudio. I'm trying to make simple programs. One would record the sound and save it in baniry file, and the other one should open it and play. Here is my code for recording:

#ifdef HAVE_CONFIG_H
   #include <config.h>
#endif

#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <fcntl.h>
#include <stdlib.h>
#include <pulse/simple.h>
#include <pulse/error.h>

#define BUFSIZE 32

int main(int argc, char*argv[])
{

     /* The Sample format to use */
    static const pa_sample_spec ss = {
               .format = PA_SAMPLE_S16LE, //16bit iqneba agwerili tito sample
               .rate = 44100, //number of samples played in each second
               .channels = 2
            };

    pa_simple *s_in = NULL;
    int ret = 1;
    int error;
    int siri =0;


    //file info
    FILE* pFile;
    char* yourFilePath  = "xma.bin";
    pFile = fopen(yourFilePath,"wb");





    if (!(s_in = pa_simple_new(NULL, argv[0], PA_STREAM_RECORD, NULL, "record", &ss, NULL, NULL, &error)))
    {
        fprintf(stderr, __FILE__": pa_simple_new() failed: %s\n", pa_strerror(error));
        goto finish;
    }

    for (;siri<10000;siri+=1) 
    {
        uint8_t buf[BUFSIZE];
        ssize_t r;

        int   yorBufferSize = strlen(buf) + 1;


        /* Write your buffer to disk. */


        if (pa_simple_read(s_in, buf, sizeof(buf), &error) < 0) 
        {

            fprintf(stderr, __FILE__": read() failed: %s\n", strerror(errno));
            goto finish;
        }



       if (pFile)
       {
            fwrite(buf, yorBufferSize, 1, pFile);
            puts("Wrote to file!");
       }
       else
       {
            puts("Something wrong writing to File.");
       }


    }


    ret = 0;

    finish:

    if (s_in)
        pa_simple_free(s_in);


    return ret;
    fclose(pFile);
}

And here is my recording program:

#ifdef HAVE_CONFIG_H
#include <config.h>
#endif

#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <fcntl.h>
#include <stdlib.h>
#include <pulse/simple.h>
#include <pulse/error.h>

#define BUFSIZE 32

int main(int argc, char*argv[]) 
{

    /* The Sample format to use */
    static const pa_sample_spec ss = {
        .format = PA_SAMPLE_S16LE, //16bit iqneba agwerili tito sample
        .rate = 44100, //number of samples played in each second
        .channels = 2
    };

    pa_simple *s_out = NULL;
    int ret = 1;
    int error;


    //file info
    FILE* pFile;
    char* yourFilePath  = "xma.bin";
    pFile = fopen(yourFilePath, "rb");



     /* Create a new playback stream */
     if (!(s_out = pa_simple_new(NULL, argv[0], PA_STREAM_PLAYBACK, NULL, "playback", &ss, NULL, NULL, &error))) 
     {
         fprintf(stderr, __FILE__": pa_simple_new() failed: %s\n", pa_strerror(error));
         goto finish;
     }

    for (;;) 
    {
        uint8_t buf[BUFSIZE];
        fread(buf, sizeof(buf), 1, pFile);
        ssize_t r;

        if(feof(pFile))
        {
            break;
        }


        printf("%x", buf);

        /* ... and play it */
        if (pa_simple_write(s_out, buf, sizeof(buf), &error) < 0) 
        {
            fprintf(stderr, __FILE__": pa_simple_write() failed: %s\n", pa_strerror(error));
            goto finish;
        }


    }


    /* Make sure that every single sample was played */
    if (pa_simple_drain(s_out, &error) < 0) 
    {
        fprintf(stderr, __FILE__": pa_simple_drain() failed: %s\n", pa_strerror(error));
        goto finish;
    }

    ret = 0;

    finish:

    if (s_out)
        pa_simple_free(s_out);

    return ret;
    fclose(pFile);
}

For loop in record program is just for time to record something(could not figure out how to set a timer) and I know that I should not use gotos but its for educational purposes(example provided on PulseAudio website). I tried hexdump of xma.bin and it gave me totally different ouput than printf("%x", buf); Basically printf only gives back bf9fe15c repeatedly and it make annoying sound. Hope you can help. thanks.

Ojs
  • 924
  • 1
  • 12
  • 26

1 Answers1

0

I deleted pa_simple_drain() (it was my mistake that i used this function in recording program)function from record program and now it works. But in printf("%x", buf) it still gives me back same hex value over and over again. But programs work great. Can someone exmplain why does it print same value?

Ojs
  • 924
  • 1
  • 12
  • 26
  • Check for warnings: 60:9: warning: format ‘%x’ expects argument of type ‘unsigned int’, but argument 2 has type ‘uint8_t *’ [-Wformat=] printf("%x", buf); ^ – Michi Nov 18 '15 at 12:17
  • i changed it to printf("%x", (unsigned int)buf); but doesn't work – Ojs Nov 18 '15 at 12:47