Monitoring real-time air waves
This loop looks odd...

static void *demod_thread_fn(void *arg)
{
    while (!do_exit)
    {
        if (do_exit)
        {
            return 0;
        }

        ...
    }

    return 0;
}


Looks to me like you can get rid of the if. If do_exit can change
between the first check and the second, and that's important, then you have
a race condition -- it could change after the second check as well.  No
amount of rechecking can provide you any assurances.
Consider using a semaphore rather than busy-waiting for o_buffer_count to change.
Decide whether this is to be C or C++. :P  If it is supposed to be C++, then you should be using new and delete rather than malloc and free. If it's not, then you ought to either typedef your struct types or actually say struct output_buffer etc.