Partage
  • Partager sur Facebook
  • Partager sur Twitter

Audio

Sujet résolu
    21 janvier 2018 à 17:23:22

    Bonjour,

    J'ai un problème quant au son d'une de mes applications. Je m'explique : j'ai commencé à faire un programme qui, lorsque j'appuie sur une touche, est censé jouer le son que représente une sinusoïde. J'avais commencé par utiliser OpenAL pour cela, mais le problème était que dès que je changeais le buffer (qui contient les 441 prochains octets à jouer) de ma source, il y avait un "poc" qui se faisait entendre, et c'était insupportable. J'ai donc choisi de faire autrement et de me diriger vers AudioInputStream et compagnie. Le problème est que je ne sais pas comment dire à mon AudioInputStream que sa source est infinie, et qu'il doit donc jouer à l'infini, jusqu'à ce que j'arrête le programme. Voici le code d'initialisation :

    bis = new BufferedInputStream(new InputStream() {
    				@Override
    				public int read() throws IOException {
    					if(nbreWritten == 0)
    						return 127;
    					nbreWritten--;
    					return datas[nbreWritten];
    				}
    		});
    		
    ais = new AudioInputStream(bis, new AudioFormat(44100, 8, 1, false, false), 441000);
    	 
    	try {
    	  clip = AudioSystem.getClip();
    	  clip.open(ais);
    	  clip.loop(Clip.LOOP_CONTINUOUSLY);
    	} catch (Exception e) {
    	  System.err.println(e.getMessage());
    	}
    		
    	thread = new Thread(new Runnable() {
    			
    		@Override
    		public void run() {
    			clip.start();
    		}
    	});
    thread.start();

    datas[] est un tableau de char qui contient donc les données à lire. Mais le problème est que monprogramme lit les 8100 premières données environ et s'arrête là. J'avais essayé de jouer avec le dernier argument de ais (mon AudioInputStream), mais rien à faire ...

    Bon, voilà, j'espère que c'est assez clair, je vous remercie d'avance pour votre réponse et vous souhaite une bonne fin de soirée.

    • Partager sur Facebook
    • Partager sur Twitter
    Apprenez, codez, dessinez, réfléchissez, ... L'important c'est d'aimer ce que l'on fait.
      22 janvier 2018 à 19:02:51

      Bon, j'ai compris pourquoi ça marche pas. Maintenant reste plus qu'à comprendre comment résoudre le problème ^^'

      bis = new InputStream() {
      				@Override
      				public int read() throws IOException {
      					Debug.dln(time);
      					return readValue();
      				}
      		};
      		
      		ais = new AudioInputStream(bis, new AudioFormat(44100, 8, 1, false, false), 4410000);
      	 
      		// ca bloque parce qu'il lit tous les 4410000 d'un coup, avant de faire la suite -> voir comment faire pour qu'il lise au fur et à mesure
      		
      	   try {
      	      clip = AudioSystem.getClip();
      	      clip.open(ais);
      	      clip.start();
      	    } catch (Exception e) {
      	      System.err.println(e.getMessage());
      	    }

      Voilà. En plus j'ai pas trop besoin d'expliquer, j'ai mis un commentaire ^^ Mais du coup, comment je pourrais envoyer en temps réel (ou en différé de quelques millisecondes) mes données à mon Clip ?

      En espérant que quelqu'un puisse me répondre ^^' Passez une bonne soirée :)

      Edit : J'ai trouvé !!! Il faut utiliser les SourceDataLine si vous avez le même problème ;)

      -
      Edité par Mathiouza 22 janvier 2018 à 19:31:24

      • Partager sur Facebook
      • Partager sur Twitter
      Apprenez, codez, dessinez, réfléchissez, ... L'important c'est d'aimer ce que l'on fait.

      Audio

      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
      • Editeur
      • Markdown