int ReadMedia::decodeAudio( gavl_audio_frame_t * af ) {
	lockState();
	if (m_state != STATE_READY || m_audio_stream_count < 1 || m_fifoaudio == NULL ) {
		unlockState();
		return -1;
	}

	if ( !m_fifoaudio->Get( af )  ) {
		if ( m_aeof ) {
			m_pcm_seek = SEEK_NOTHING;
			unlockState();
			signalA();
			return 0;
		} else {
			printf("Couldn't get an audio frame, audiofifo is %f full.\n", m_fifoaudio->getSizePercentage()); // this can only happen if the fifo is empty
			unlockState();
			signalA();
			return -1;
		}
	}

	//m_atime = af->timestamp / (double)m_audio_format.samplerate;
	unlockState();
	signalA();
	return 1 ;
}
bool ReadMedia::rewind() {
	// NOTE!! Always check for stream count before setting aeof or veof
	lockState();
	if ( m_state == STATE_READY && m_file != NULL) {
		//printf("ReadMedia::rewind(), valid_samples=%d\n", m_audio_frame->valid_samples);
		m_pcm_seek = SEEK_REWIND;	
		if(m_audio_stream_count) m_aeof = false;
		//m_atime = 0;
		m_frame_seek=SEEK_REWIND;
		if (m_video_stream_count) m_veof = false;
		//m_vtime=0;

		unlockState();
		if (m_audio_stream_count) {
			signalA();  // only signal one or the other here
			//printf("ReadMedia::rewind(), signaled audio\n");
			// we are gong to flush here even though it is flushed
			// during the audio or video thread.  This will ensure our fifo 
			// is clean and empty.  Otherwise, the audio thread may be waiting
			// at the bottom of its loop and not make it to the flush part even 
			// though we signalled it.
			if (m_fifoaudio)
				m_fifoaudio->Flush();
		}
		else if (m_video_stream_count) {
			signalV();
			if (m_fifovideo)
				m_fifovideo->Flush();
		}

		return true;
	}
	unlockState();
	return false;
}
int main()
{

//      probamos una conexión de signal con otro signal  (2009-06-09) con parámetros
    {
        mtk::Signal<>  signalA;

        mtk::Signal<> signalB;

        PrReceptor pr;
        signalB.connect(&pr, &PrReceptor::OnNoParam);

        signalB();


        //  aunque la conexión se puede hacer así...
        signalA.connect(&signalB, &mtk::Signal<>::operator());


        //  parece más cómodo de esta otra forma
        signalA.connect(&signalB);



        //  emitimos señal
        signalA();

    }


//      probamos una conexión de signal con otro signal  (2009-06-09) con parámetros
    {
        mtk::Signal<int>  signalA;

        mtk::Signal<int> signalB;

        PrReceptor pr;
        signalB.connect(&pr, &PrReceptor::OnIntParam);

        signalB(5);

        signalA.connect(&signalB);

        signalA.emit(3);

    }

    std::cout << std::endl;


    #include "support/release_on_exit.hpp"
    return 0;
}
void ReadMedia::signalAV() { signalA(); signalV(); }