2011-04-21 5 views
4

Je veux accrocher un circuit à mon ordinateur, qui utilise la sortie audio comme un courant alternatif, passe certaines fréquences, puis rectifie à quelques LEDs, donc si j'écris un programme qui vous permet de créer un modèle spécifique et une combinaison des LED à allumer, il produirait des sons de fréquence spécifiques.Sortie audio spécifique C++?

Comment lire un son à une fréquence spécifique en utilisant C++?

Possible?

+1

Quel système d'exploitation utilisez-vous? Des bibliothèques/frameworks particuliers? – Gabe

+1

Dépend entièrement du périphérique et du pilote de périphérique. –

+0

Fermé. Sans une réponse aux questions de James et Gabe, il n'y a aucun moyen pour nous de vous fournir une réponse significative. Notez que même avec cette information, vous devriez toujours rechercher cette question par vous-même et ne pas demander d'information jusqu'à ce que vous soyez coincé. Bien que vous couriez aussi le risque d'être fermé pour être trop localisé si votre question concerne les détails spécifiques de votre circuit. Dans cette situation, je recommande de demander de l'aide sur un forum de discussion sur le circuit spécifique. – Brian

Répondre

1

Vous pouvez le faire avec OpenAL.

Vous devez générer un tableau contenant des données codées PCM représentant votre sortie désirée, puis appeler alBufferData() sur votre tableau avec la fréquence d'échantillonnage et le format désirés. Voir page 21 du OpenAL Programmers Guide pour le format requis par la fonction alBufferData().

Par exemple, le code suivant lit une tonalité de 100 Hz.

#include <iostream> 

#include <cmath> 

#include <al.h> 
#include <alc.h> 
#include <AL/alut.h> 

#pragma comment(lib, "OpenAL32.lib") 
#pragma comment(lib, "alut.lib") 

int main(int argc, char** argv) 
{ 
    alutInit(&argc, argv); 
    alGetError(); 

    ALuint buffer; 
    alGenBuffers(1, &buffer); 

    { 
    // Creating a buffer that hold about 1.5 seconds of audio data. 
    char data[32 * 1024]; 

    for (int i = 0; i < 32 * 1024; ++i) 
    { 
     // get a value in the interval [0, 1) over the length of a second 
     float intervalPerSecond = static_cast<float>(i % 22050)/22050.0f; 

     // increase the frequency to 100hz 
     float intervalPerHundreth = fmod(intervalPerSecond * 100.0f, 1.0f); 

     // translate to the interval [0, 2PI) 
     float x = intervalPerHundreth * 2 * 3.14159f; 

     // and then convert back to the interval [0, 255] for our amplitude data. 
     data[i] = static_cast<char>((sin(x) + 1.0f)/2.0f * 255.0f); 
    } 

    alBufferData(buffer, AL_FORMAT_MONO8, data, 32 * 1024, 22050); 
    } 

    ALuint source; 
    alGenSources(1, &source); 

    alSourcei(source, AL_BUFFER, buffer); 

    alSourcePlay(source); 

    system("pause"); 

    alSourceStop(source); 

    alDeleteSources(1, &source); 

    alDeleteBuffers(1, &buffer); 

    alutExit(); 

    return 0; 
}