Newsgroup: it.comp.lang.c
Titolo: funzione sound che non va

In questa funzione sound non riesco a far suonare tutte le note 
consecutivamente, ogni volta che la lancio riesco a sentire una sola nota, 
forse ci vorrebbe una "pausa" nel ciclo for o qualcosa del genere.
Qualcuno ha un'idea?
--------------------
#include<stdio.h>
int sound(int frequenza,int durata);
int main()
{
	int i;
	for (i=100;i<10000;i++)
		sound(i,500);
}
int sound(int frequenza, int durata)
{
	printf("\x1B[10;%d]",frequenza);
	printf("\x1B[11;%d]",durata);
	printf("\x7");
}
-- 
My OS: Linux Red Hat 7.2    |    "I bambini non scrivono lettere per molto
ICQ #147054457              |         tempo anche quando giurano di farlo.
Linux User #276372          |    Ci sono troppe cose nuove a cui pensare."
Linux Machie #159118        |          Stephen King - "Cuori in Atlantide"

 ha scritto nel messaggio
news:Pine.LNX.4.33.02073...@enigma.cerchietto.it...


 di questo tuo problema nel caso ce l'avessi fatta a trovarla da solo.
Adesso funziona... più o meno.
La funzione sound quando veniva richiamata una volta funzionava, quando 
l'ho messa all'interno del ciclo for e veniva richiamata più volte 
consecutive ha smesso di funzionare, e non capisco ancora il perché.
Si riusciva a sentire solo l'ultimo BELL, se invece, all'interno del ciclo 
for inserivo un "getchar();" e tenevo premuto il tasto invio durante 
l'esecuzione tutto funzionava.
Ho provato a compilare anche su DOS/WIN, lì funziona, i BELL vengono 
accodati e suonati. Su linux invece non vengono accodati ed il bell 
successivo sovrascrive quello precedente non ancora suonato.
Ho pensato di ritardare la funzione aggiungendo un' "usleep(durata);" per 
dargli il tempo di mandare l'output, il bell, ma non andava lo stesso così 
al posto di usleep ho usato un ciclo do...while calcolando il tempo con 
ftime, ma c'é ancora una cosa che non va: se nel ciclo do..while non metto 
una printf che mi stampi qualcosa non funziona, così ho messo
"printf(" \x8");" \x8 é il backspace, dopo aver scritto quell'"inutile" 
spazio torna indietro.
Ecco il listato:
--------------------
#include<stdio.h>
#include<sys/timeb.h>
int sound(int frequenza,unsigned int durata);
int main()
{
	int i;
	char ch;
	for (i=100;i<1000;i=i+10)
	{
		sound(i,200);
		/* getchar(); */
	}
}
int sound(int frequenza, unsigned int durata)
{
	struct timeb tp;
	unsigned int sectrasc = 0, seciniz;
	unsigned int milltrasc = 0, milliniz;
	unsigned int tottrasc;
	printf("\x1B[10;%d]",frequenza);
	printf("\x1B[11;%d]",durata);
	printf("\x7");
	ftime(&tp);
	seciniz = tp.time;
	milliniz = tp.millitm;
	do
	{
		ftime(&tp);
		sectrasc = (tp.time - seciniz);
		milltrasc = ((1000+(tp.millitm))-milliniz)-1000;
		tottrasc = (sectrasc*1000)+milltrasc;
		/* printf("confonto : %d < %d \n",tottrasc, durata); */
		printf(" \x8");
	} while(tottrasc < durata);


Non potrebbe dipendere dal buffer di out su schermo? Con un buffer di
lunghezza nulla dovrebbe funzionare senza troppi problemi (dovrebbe essere
necessario anche una attesa).
Dovrebbe esistere una funzione setbuf, credo, oppure affidarsi a system call
particolari... (sono in vacanza e non ho manuali su cui controllare).
Luigi Mantellini
Per il pessimista il bicchiere è mezzo vuoto,
per l'ottimista è mezzo pieno,
per un ingegnere è semplicemente sovradimensionato rispetto l'uso.