bool PortAudioDeviceDriver::getSound(yarp::sig::Sound& sound)
{
    if (pThread.something_to_record == false)
    {
        this->startRecording();
    }

    int buff_size = 0;
    static int buff_size_wdt = 0;
    while (buff_size<this->numSamples*this->numChannels)
    {
         buff_size = dataBuffers.recData->size();
         if (buff_size == 0 && buff_size_wdt++ == 100) break;
         yarp::os::SystemClock::delaySystem(SLEEP_TIME);
    }
    buff_size_wdt = 0;

    if (sound.getChannels()!=this->numChannels && sound.getSamples() != this->numSamples)
    {
        sound.resize(this->numSamples,this->numChannels);
    }
    sound.setFrequency(this->driverConfig.rate);

    for (int i=0; i<this->numSamples; i++)
        for (int j=0; j<this->numChannels; j++)
            {
                SAMPLE s = dataBuffers.recData->read();
                sound.set(s,i,j);
            }
    return true;
}
bool MicrophoneDeviceDriver::getSound(yarp::sig::Sound& sound) {
    // main loop to capture the waveform audio data
    unsigned char *data = pulsecode;
    int begun = 1;
    int bytes_to_grab = NUM_SAMPLES / 16;
    int bytes_to_save = NUM_SAMPLES;
    while ( bytes_to_save > 0 )
        {
            int nbytes = read( dsp, data, bytes_to_grab );
            if ( !begun )
                {
                    int max = 0;
                    for (int i = 0; i < nbytes; i++)
                        if ( data[i] > max ) max = data[i];
                    if ( max > 0x99 ) begun = 1;
                    else continue;
                }
            bytes_to_save -= nbytes;
            data += nbytes;
        }
    sound.resize(NUM_SAMPLES);
    double total = 0;
    for (int i=0; i<NUM_SAMPLES; i++) {
        sound.set(pulsecode[i],i);
        total += abs(pulsecode[i]-128);
    }
    printf( "grabbing a chunk of %d samples... magnitude: %g\n",
            NUM_SAMPLES, total);
    return true;
}