L’affectation de variables locales entraîne l’arrêt du traitement de l’audio dans JUCE

EDIT: Il s’est avéré qu’il s’agissait d’une variable non initialisée créant un comportement chaotique. Voir cet article pour obtenir plus d’avertissements du compilateur pour JUCE

J’essayais de créer un synthétiseur de base et j’ai rapidement rencontré un problème absurde lorsque je tentais simplement d’atsortingbuer une valeur à une variable nouvellement déclarée. Après avoir suivi le didacticiel de synthèse sine simple de JUCE, je me suis heurté au problème. C’est le code de base de ma fonction getNextAudioBlock() lorsqu’elle produit du bruit blanc. Notez comment quatre entiers sont déclarés et affectés:

 const int numChannels = bufferToFill.buffer->getNumChannels(); const int numSamples = bufferToFill.numSamples; for (int channel = 0; channel  getWritePointer(channel, bufferToFill.startSample); for (int sample; sample < numSamples; sample++){ buffer[sample] = (randomGen.nextFloat() * 2.0f - 1.0f); } } 

Cependant, dès que j’essaie d’append un autre int, je n’ai plus de son. Il vous suffit simplement d’append la ligne int unusedVariable = 0; n’importe où dans la fonction getNextAudioBlock() mais avant l’atsortingbution du buffer[sample] renvoyée immédiatement de la fonction et ne produit donc aucun son.

Si je déclare simplement la nouvelle variable ( int unusedVariable; ), alors cela fonctionne toujours. Ce n’est que spécifiquement la partie affectation qui cause l’erreur. De plus, si je déclare la variable en tant que membre global, l’affectation dans la fonction fonctionne parfaitement.

Pour répéter, cela fonctionne:

 buffer[sample] = (randomGen.nextFloat() * 2.0f - 1.0f; 

Cela marche:

 int unusedVariable; buffer[sample] = (randomGen.nextFloat() * 2.0f - 1.0f; 

Mais cela ne veut pas:

 int unusedVariable = 0; buffer[sample] = (randomGen.nextFloat() * 2.0f - 1.0f; 

Ma seule idée était que l’allocation de nouvelle mémoire sur le fil audio était la cause de l’erreur, mais j’ai vu des déclarations et des assignations effectuées dans d’autres sources en ligne et même dans ma même fonction avec numChannels, numSamples, channel et sample, toutes affectées et affectées parfaitement. J’ai aussi considéré que cela avait quelque chose à voir avec l’utilisation de la classe Random, mais je rencontre le même problème même quand il génère des ondes sinusoïdales.

EDIT: Voici le code exact copié à partir du projet. Ici, nextSample est déclaré globalement, car le tampon n’est pas rempli lorsqu’il est déclaré localement

  void MainContentComponent::getNextAudioBlock (const AudioSourceChannelInfo& bufferToFill) { const int numChannels = bufferToFill.buffer->getNumChannels(); const int numSamples = bufferToFill.numSamples; for (int channel = 0; channel  getWritePointer (channel, bufferToFill.startSample); for (int sample; sample < numSamples; sample++){ // nextSample = (randomGen.nextFloat() * 2.0f - 1.0f); // For Randomly generated White Noise nextSample = (float) std::sin (currentAngle); currentAngle += angleDelta; buffer[sample] = nextSample * volumeLevel; } } } 

J’ai créé un nouveau projet AudioApplication dans le projet et collé ce bloc de code dans la méthode getNextAudioBlock() (en ajoutant des variables de membre sensibles lors de leur référencement ici).

Le compilateur a immédiatement signalé le problème: la variable de boucle ci-dessous n’est pas initialisée (et C ++ ne l’initialisera pas par défaut), donc si la mémoire utilisée par cette variable contenait une valeur inférieure à la valeur taille de la mémoire tampon, vous allez générer de l’audio; sinon, le tampon transmis à cette fonction n’est pas affecté car la boucle ne s’exécute jamais.

  for (int sample; sample < numSamples; sample++){ nextSample = (randomGen.nextFloat() * 2.0f - 1.0f); // For Randomly generated White Noise //nextSample = (float) std::sin (currentAngle); //currentAngle += angleDelta; buffer[sample] = nextSample * volumeLevel; } 

voyez si changer cela pour for (int sample=0; ne règle pas le problème pour vous.