gerardorom
14-12-2007, 21:32:15
Hola amigos, os expongo aqui mi duda con una breve explicación. Intento hacer una especie de reproductor de archivos .wav con la libreria API de windows. Uso 3 botones, 1º:PLAY: para reproducir (y grabar en un archivo de salida), 2º:PAUSA: para pausar y 3º:RESTART: para reaundar la marcha.
El caso es que cuando pulso play, no me permite pulsar los otros dos botones, hasta que no acaba la reproducción. ¿Como puedo hacer para saltar entre las rutinas asociadas a los botones, volviendo al punto donde se quedó en la reproducción? Os adjunto el codigo por si sirve de ayuda .
NOTA: Para la reproduccion se van almacenando en un bloque circular y se va reproduciendo atraves de dos buffer (1 y2) para evitar saltos en la reproducción.
BOTON PLAY (he intentado resumirlo al maximo):
void __fastcall TForm1::Button1Click(TObject *Sender)
{
waveOutPrepareHeader(hwo,&bufferinf1,sizeof(bufferinf1));
waveOutPrepareHeader(hwo,&bufferinf2,sizeof(bufferinf2));
z=0;
for(i=0;i < numiter;++i)
{
fread(datos,(cab.bpm/8),tamiter,fich);
if (buf1)
{
waveOutPrepareHeader(hwo,&bufferinf1,sizeof(bufferinf1));
while (bufferinf1.dwFlags!=WHDR_PREPARED)
{
}
}
else
{
waveOutPrepareHeader(hwo,&bufferinf2,sizeof(bufferinf2));
while (bufferinf2.dwFlags!=WHDR_PREPARED)
{
}
}
for(j=0;j < tambuffer;++j)
{
cir[z]=datos[j];
if(buf1)
{
buffer1[j]=datos[j];
}
else
{
buffer2[j]=datos[j];
}
if (z<tamcir) { z=z+1;}
else { z=0; } ;
};
if(buf1)
{
fwrite(buffer1,(cab.bpm/8),tambuffer,fich2);
waveOutWrite(hwo,&bufferinf1,sizeof(bufferinf1));
while(waveOutUnprepareHeader( hwo,&bufferinf2,sizeof(bufferinf2)) == WAVERR_STILLPLAYING)
{
}
}
else
{
fwrite(buffer2,(cab.bpm/8),tambuffer,fich2);
waveOutWrite(hwo,&bufferinf2,sizeof(bufferinf2));
while(waveOutUnprepareHeader( hwo,&bufferinf1,sizeof(bufferinf1)) == WAVERR_STILLPLAYING)
{
}
};
buf1=!buf1;
};
}
BOTON PAUSE:
void __fastcall TForm1::Button2Click(TObject *Sender)
{
waveOutPause(hwo);
}
BOTON RESTAR:
void __fastcall TForm1::Button3Click(TObject *Sender)
{
waveOutRestart(hwo);
}
Muchas gracias por todo. Saludos!
El caso es que cuando pulso play, no me permite pulsar los otros dos botones, hasta que no acaba la reproducción. ¿Como puedo hacer para saltar entre las rutinas asociadas a los botones, volviendo al punto donde se quedó en la reproducción? Os adjunto el codigo por si sirve de ayuda .
NOTA: Para la reproduccion se van almacenando en un bloque circular y se va reproduciendo atraves de dos buffer (1 y2) para evitar saltos en la reproducción.
BOTON PLAY (he intentado resumirlo al maximo):
void __fastcall TForm1::Button1Click(TObject *Sender)
{
waveOutPrepareHeader(hwo,&bufferinf1,sizeof(bufferinf1));
waveOutPrepareHeader(hwo,&bufferinf2,sizeof(bufferinf2));
z=0;
for(i=0;i < numiter;++i)
{
fread(datos,(cab.bpm/8),tamiter,fich);
if (buf1)
{
waveOutPrepareHeader(hwo,&bufferinf1,sizeof(bufferinf1));
while (bufferinf1.dwFlags!=WHDR_PREPARED)
{
}
}
else
{
waveOutPrepareHeader(hwo,&bufferinf2,sizeof(bufferinf2));
while (bufferinf2.dwFlags!=WHDR_PREPARED)
{
}
}
for(j=0;j < tambuffer;++j)
{
cir[z]=datos[j];
if(buf1)
{
buffer1[j]=datos[j];
}
else
{
buffer2[j]=datos[j];
}
if (z<tamcir) { z=z+1;}
else { z=0; } ;
};
if(buf1)
{
fwrite(buffer1,(cab.bpm/8),tambuffer,fich2);
waveOutWrite(hwo,&bufferinf1,sizeof(bufferinf1));
while(waveOutUnprepareHeader( hwo,&bufferinf2,sizeof(bufferinf2)) == WAVERR_STILLPLAYING)
{
}
}
else
{
fwrite(buffer2,(cab.bpm/8),tambuffer,fich2);
waveOutWrite(hwo,&bufferinf2,sizeof(bufferinf2));
while(waveOutUnprepareHeader( hwo,&bufferinf1,sizeof(bufferinf1)) == WAVERR_STILLPLAYING)
{
}
};
buf1=!buf1;
};
}
BOTON PAUSE:
void __fastcall TForm1::Button2Click(TObject *Sender)
{
waveOutPause(hwo);
}
BOTON RESTAR:
void __fastcall TForm1::Button3Click(TObject *Sender)
{
waveOutRestart(hwo);
}
Muchas gracias por todo. Saludos!