Logicielsmoto.com

Nous sommes le 28 Mar 2024, 19:10

Heures au format UTC + 1 heure




Poster un nouveau sujet Répondre au sujet  [ 25 messages ]  Aller à la page 1, 2  Suivante
Auteur Message
MessagePosté: 27 Jan 2010, 09:02 
Hors ligne

Inscription: 27 Juin 2006, 19:44
Messages: 1061
Localisation: France (24)
Grosse question du jour : Teo, en l'état, fonctionne-t-il sur Windows Vista et Windows 7 ?


Haut
 Profil  
Répondre en citant le message  
 Sujet du message:
MessagePosté: 30 Jan 2010, 14:32 
Hors ligne

Inscription: 27 Juin 2006, 19:44
Messages: 1061
Localisation: France (24)
Up! :lol:


Haut
 Profil  
Répondre en citant le message  
 Sujet du message:
MessagePosté: 30 Jan 2010, 20:28 
Hors ligne

Inscription: 27 Mai 2006, 03:09
Messages: 58
Je me cramponne toujours à XP, donc je ne sais pas pour Vista ni Win7.
Par contre, il fonctionne bien sous XP mais il fait turbiner ma machine: le ventilo tourne autant qu'il peut. Ma config' n'est pas basse pourtant: Pentium IV 2,8 GHz (portable, Sony Vaio).
Mais sinon ça marche très bien.
Voila qui ne répond pas du tout à ta question. :)

Sin.


Haut
 Profil  
Répondre en citant le message  
 Sujet du message:
MessagePosté: 31 Jan 2010, 14:15 
Hors ligne

Inscription: 27 Juin 2006, 19:44
Messages: 1061
Localisation: France (24)
Oui, je ne sais pas pour l'instant pourquoi Teo utilise 100% du CPU sous Windows. C'est d'autant plus gênant que ça pourrait être évité, du moins au repos...


Haut
 Profil  
Répondre en citant le message  
 Sujet du message:
MessagePosté: 21 Mar 2010, 21:42 
Hors ligne

Inscription: 21 Aoû 2006, 09:06
Messages: 1802
Localisation: Brest
Prehisto a écrit:
Oui, je ne sais pas pour l'instant pourquoi Teo utilise 100% du CPU sous Windows.


J'ai trouvé. Le problème vient du while() sur get_audio_stream_buffer() dans asound.c
Code:
void PlaySoundBuffer(void)
{
    register int i;
    char *buffer_ptr;

    /* on remplit la fin du buffer avec le dernier byte déposé */
    for (i=last_index; i<sound_buffer_size; i++)
        sound_buffer[i]=last_data;

    last_index=0;

    while ((buffer_ptr=get_audio_stream_buffer(stream)) == NULL) /* <=== NdSam: ICI! */
        ;


    memcpy(buffer_ptr, sound_buffer, sound_buffer_size);
   
    free_audio_stream_buffer(stream);
}


L'idée du programmeur est, je crois, d'attendre la fin de la période de 1/50sec du driver son pour la synchro. Ca marche bien, sauf quand la fenêtre n'est plus active, car dans ce cas pour un raison que j'ignore get_audio_stream_buffer() vaut tout le temps NULL et la boucle mange 100% du cpu.

Perso j'ai ajouté un petit usleep(1000) pour pauser le système pendant 1ms entre 2 appels:
Code:
while ((buffer_ptr=get_audio_stream_buffer(stream)) == NULL)
    usleep(1000);
Et ca marche beaucoup mieux! Cela dit c'est pas la meilleur solution car si on joue du son, alors il part quand même en boucle (sans manger du cpu cependant).

sam.


Haut
 Profil  
Répondre en citant le message  
 Sujet du message:
MessagePosté: 21 Mar 2010, 22:17 
Hors ligne

Inscription: 27 Juin 2006, 19:44
Messages: 1061
Localisation: France (24)
Le meilleur moyen serait effectivement d'éliminer cette boucle. Après tout, il s'agit d'une boucle dans une boucle, puisque la fonction est appelée par la boucle dans RunTo8(). Un "if" devrait donc suffire. Il faudrait voir quel taille de buffer pour le son devrait être employé pour devenir confortable, même pour des ordinateurs "lents"...

Code:
    if ((buffer_ptr=get_audio_stream_buffer(stream)) != NULL)
    {
         memcpy(buffer_ptr, sound_buffer, sound_buffer_size);
   
         free_audio_stream_buffer(stream);
    }


Haut
 Profil  
Répondre en citant le message  
 Sujet du message:
MessagePosté: 21 Mar 2010, 22:31 
Hors ligne

Inscription: 21 Aoû 2006, 09:06
Messages: 1802
Localisation: Brest
Prehisto a écrit:
Le meilleur moyen serait effectivement d'éliminer cette boucle. Après tout, il s'agit d'une boucle dans une boucle, puisque la fonction est appelée par la boucle dans RunTo8(). Un "if" devrait donc suffire. Il faudrait voir quel taille de buffer pour le son devrait être employé pour devenir confortable, même pour des ordinateurs "lents"...


Je suis pas certain que virer la boucle while() soit une bonne idée. En fait la bouche principale de l'emul s'execute en 1/50 secs.. Si elle s'exécute plus vite parce que le CPU natif est puissant, la boucle du while() dans asound.c est là pour le pauser de sorte à être synchro avec un vrai TEO. Donc si on vire cette boucle dans le asound, on ira trop vite.

Si tu veux je peux te filer le sources de TEO que j'ai un peu retravaillé. J'ai allongé les buffers son pour être moins saccadés sur ma machine. J'ai aussi ajouté quelques goodies (ligne de cmd, drop de fichier SAP sur l'exe, possibilité de monter un dossier PC en disk TO, support FD 320ko ou 640ko en lecture/écriture, etc). Normalement tu as du recevoir des mails de ma part à ce sujet.

Dans les cartons, mais pas pour tout de suite (car je n'en ai pas besoin).. un serveur http embarqué pour piloter le debugger depuis l'exterieur (en vue de greffer TEO à un IDE de developpement ou autre).

sam.


Haut
 Profil  
Répondre en citant le message  
 Sujet du message:
MessagePosté: 21 Mar 2010, 22:41 
Hors ligne

Inscription: 27 Juin 2006, 19:44
Messages: 1061
Localisation: France (24)
Samuel Devulder a écrit:
Donc si on vire cette boucle dans le asound, on ira trop vite.

Effectivement, c'est sur cette boucle que repose toute la tempo.

Samuel Devulder a écrit:
Si tu veux je peux te filer le sources de TEO que j'ai un peu retravaillé.[...] Normalement tu as du recevoir des mails de ma part à ce sujet.

.... mais c'est à croire que tu n'as pas reçu les miens concernant les fichiers diff.


Haut
 Profil  
Répondre en citant le message  
 Sujet du message:
MessagePosté: 21 Mar 2010, 22:59 
Hors ligne

Inscription: 21 Aoû 2006, 09:06
Messages: 1802
Localisation: Brest
Prehisto a écrit:
.... mais c'est à croire que tu n'as pas reçu les miens concernant les fichiers diff.


Heu non j'ai rien reçu de mon coté.


Haut
 Profil  
Répondre en citant le message  
 Sujet du message:
MessagePosté: 21 Mar 2010, 23:01 
Hors ligne

Inscription: 27 Juin 2006, 19:44
Messages: 1061
Localisation: France (24)
Samuel Devulder a écrit:
Heu non j'ai rien reçu de mon coté.

Je me disais aussi... D'habitude, tu mettais moins de temps à répondre aux mails ;). Je te les renvoie.


Haut
 Profil  
Répondre en citant le message  
 Sujet du message:
MessagePosté: 21 Mar 2010, 23:11 
Hors ligne

Inscription: 21 Aoû 2006, 09:06
Messages: 1802
Localisation: Brest
Prehisto a écrit:
Samuel Devulder a écrit:
Heu non j'ai rien reçu de mon coté.

Je me disais aussi... D'habitude, tu mettais moins de temps à répondre aux mails ;). Je te les renvoie.


C'est gmail qui déconne (son accès imap ne marche plus chez moi)..

sam.


Haut
 Profil  
Répondre en citant le message  
 Sujet du message:
MessagePosté: 22 Mar 2010, 11:00 
Hors ligne

Inscription: 06 Juin 2004, 08:23
Messages: 464
Excusez-moi, j'ai peut-etre loupé un truc, mais ne serait-il pas mieux de coder "moderne" en utilisant une call-back sur un timer ou mieux sur le son, plutot qu'une boucle de tempo ? Y'a que sous DOS qu'on utilise des tempos.
La call-back est plus precise et permet d'economiser tout le temps CPU inutilise. Si j'ai correctement compris le contexte, c'est normal que l'emu prenne 100% de cpu, il n'est pas code pour un os multitache.

Fool


Haut
 Profil  
Répondre en citant le message  
 Sujet du message:
MessagePosté: 22 Mar 2010, 11:04 
Hors ligne

Inscription: 27 Juin 2006, 19:44
Messages: 1061
Localisation: France (24)
Fool-DupleX a écrit:
Excusez-moi, j'ai peut-etre loupé un truc, mais ne serait-il pas mieux de coder "moderne" en utilisant une call-back sur un timer ou mieux sur le son, plutot qu'une boucle de tempo ?

Malheureusement, Allegro précise bien que l'on ne doit pas mettre la fonction get_audio_stream_buffer() en interruption.


Haut
 Profil  
Répondre en citant le message  
 Sujet du message:
MessagePosté: 22 Mar 2010, 11:43 
Hors ligne

Inscription: 21 Aoû 2006, 09:06
Messages: 1802
Localisation: Brest
Prehisto a écrit:
Malheureusement, Allegro précise bien que l'on ne doit pas mettre la fonction get_audio_stream_buffer() en interruption.


Tout à fait. Une solution possible: utiliser [url=http://www.allegro.cc/manual/api/graphics-modes/vsync[/url]vsync()[/url] quand on recoit NULL avant de retenter un nouveau get_audio_stream_buffer(). Cela dit, j'ai un peu peur qu'attendre 1vbl soit trop long (sauf si on est en 90hz). L'experience montre que usleep() marche bien jusqu'à 10ms de pause (1/2 vbl en fait).


Haut
 Profil  
Répondre en citant le message  
 Sujet du message:
MessagePosté: 22 Mar 2010, 12:00 
Hors ligne

Inscription: 27 Juin 2006, 19:44
Messages: 1061
Localisation: France (24)
Samuel Devulder a écrit:
Cela dit, j'ai un peu peur qu'attendre 1vbl soit trop long (sauf si on est en 90hz). L'experience montre que usleep() marche bien jusqu'à 10ms de pause (1/2 vbl en fait).

Il faudrait voir jusqu'où tu peux descendre sans faire remonter l'occupation CPU en flèche.


Haut
 Profil  
Répondre en citant le message  
Afficher les messages postés depuis:  Trier par  
Poster un nouveau sujet Répondre au sujet  [ 25 messages ]  Aller à la page 1, 2  Suivante

Heures au format UTC + 1 heure


Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 22 invités


Vous ne pouvez pas poster de nouveaux sujets
Vous ne pouvez pas répondre aux sujets
Vous ne pouvez pas éditer vos messages
Vous ne pouvez pas supprimer vos messages
Vous ne pouvez pas joindre des fichiers

Rechercher:
Aller à:  
Développé par phpBB® Forum Software © phpBB Group
Traduction par phpBB-fr.com