Bonjour,
J'ai un programme basé sur OpenAL :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
 
////////////////////////////////////////////////////////////
/// En-têtes
////////////////////////////////////////////////////////////
#include <al.h>
#include <alc.h>
#include <sndfile.h>
 
#include <iomanip>
#include <iostream>
#include <cstring>
//#include "windows.h"
#include <cstddef>
 
 
 
#include <ctime>
 
 
//#include "math.h"
#include <string>
#include <vector>
 
#include <fstream>
#include <realFFT.H>
#include <cstdlib>
 
#define OUTPUTFILE "powerSpectrum.txt"
#define OUTPUTFILE1 "in.txt"
#define OUTPUTFILE2 "out.txt"
 
// Les différents devices audio utilisés
ALCdevice* Device        = NULL;
ALCdevice* CaptureDevice = NULL;
 
 
////////////////////////////////////////////////////////////
/// Récupère la liste des noms des devices de capture disponibles
///
/// \param Devices : Tableau de chaînes à remplir avec les noms des devices
///
////////////////////////////////////////////////////////////
void GetCaptureDevices(std::vector<std::string>& Devices)
{
    // Vidage de la liste
    Devices.clear();
 
    // Récupération des devices disponibles
    const ALCchar* DeviceList = alcGetString(NULL, ALC_CAPTURE_DEVICE_SPECIFIER);
 
    if (DeviceList)
    {
        // Extraction des devices contenus dans la chaîne renvoyée
        while (strlen(DeviceList) > 0)
        {
            Devices.push_back(DeviceList);
            DeviceList += strlen(DeviceList) + 1;
        }
    }
    else
    {
        std::cerr << "Impossible de récupérer la liste des devices de capture" << std::endl;
    }
}
 
 
////////////////////////////////////////////////////////////
/// Initialise OpenAL (ouvre un device et crée un contexte audio)
///
/// \param DeviceName : Nom du device à ouvrir (NULL pour le device par défaut)
///
/// \return True si tout s'est bien passé, false en cas d'erreur
///
////////////////////////////////////////////////////////////
bool InitOpenAL(const char* DeviceName = NULL)
{
    // Ouverture du device
    Device = alcOpenDevice(DeviceName);
    if (!Device)
    {
        std::cerr << "Impossible d'ouvrir le device par défaut" << std::endl;
        return false;
    }
 
    // Création du contexte
    ALCcontext* Context = alcCreateContext(Device, NULL);
    if (!Context)
    {
        std::cerr << "Impossible de créer un contexte audio" << std::endl;
        return false;
    }
 
    // Activation du contexte
    if (!alcMakeContextCurrent(Context))
    {
        std::cerr << "Impossible d'activer le contexte audio" << std::endl;
        return false;
    }
 
    return true;
}
 
 
////////////////////////////////////////////////////////////
/// Initialise la capture audio
///
/// \param DeviceName : Nom du device de capture à ouvrir (NULL pour le device par défaut)
///
/// \return True si tout s'est bien passé, false en cas d'erreur
///
////////////////////////////////////////////////////////////
bool InitCapture(const char* DeviceName = NULL)
{
    // On commence par vérifier que la capture audio est supportée
    if (alcIsExtensionPresent(Device, "ALC_EXT_CAPTURE") == AL_FALSE)
    {
        std::cerr << "La capture audio n'est pas supportée par votre systeme" << std::endl;
        return false;
    }
 
    // Ouverture du device
    CaptureDevice = alcCaptureOpenDevice(DeviceName, 44100, AL_FORMAT_MONO16, 44100);
    if (!CaptureDevice)
    {
        std::cerr << "Impossible d'ouvrir le device de capture" << std::endl;
        return false;
    }
 
    return true;
}
 
 
////////////////////////////////////////////////////////////
/// Sauvegarde un tableau d'échantillons dans un fichier audio
///
/// \param Filename : Nom du fichier audio à charger
/// \param Samples :  Tableau d'échantillons
///
////////////////////////////////////////////////////////////
void SaveSound(const std::string& Filename, const std::vector<ALshort>& Samples)
{
    // On renseigne les paramètres du fichier à créer
    SF_INFO FileInfos;
    FileInfos.channels   = 1;
    FileInfos.samplerate = 44100;
    FileInfos.format     = SF_FORMAT_PCM_16 | SF_FORMAT_WAV;
 
    // On ouvre le fichier en écriture
    SNDFILE* File = sf_open(Filename.c_str(), SFM_WRITE, &FileInfos);
    if (!File)
    {
        std::cerr << "Impossible de créer le fichier audio" << std::endl;
        return;
    }
 
    // Ecriture des échantillons audio
    sf_write_short(File, &Samples[0], Samples.size());
 
 
    // Fermeture du fichier
    sf_close(File);
}
 
 
////////////////////////////////////////////////////////////
/// Ferme proprement le device de capture
///
////////////////////////////////////////////////////////////
void ShutdownCapture()
{
    // Fermeture du device de capture
    alcCaptureCloseDevice(CaptureDevice);
}
 
 
////////////////////////////////////////////////////////////
/// Ferme proprement OpenAL
///
////////////////////////////////////////////////////////////
void ShutdownOpenAL()
{
    // Récupération du contexte
    ALCcontext* Context = alcGetCurrentContext();
 
    // Désactivation du contexte
    alcMakeContextCurrent(NULL);
 
    // Destruction du contexte
    alcDestroyContext(Context);
 
    // Fermeture du device
    alcCloseDevice(Device);
}
 
 
////////////////////////////////////////////////////////////
/// Point d'entrée du programme
///
/// \return Code d'erreur de l'application
///
////////////////////////////////////////////////////////////
int main()
{
    // Initialisation d'OpenAL avec le device par défaut
    if (!InitOpenAL(NULL))
        return 1;
 
    // Récupération des devices de capture disponibles
    std::vector<std::string> Devices;
    GetCaptureDevices(Devices);
 
    // On affiche la liste à l'utilisateur
    std::cout << "Veuillez choisir un device pour la capture :" << std::endl << std::endl;
    for (std::string::size_type i = 0; i < Devices.size(); ++i)
        std::cout << "[" << i << "] " << Devices[i] << std::endl;
 
    // Et on le laisse choisir
    int Choice;
    //std::cin >> Choice;
    Choice=3;
    // Initialisation de la capture
    if (!InitCapture(Devices[Choice].c_str()))
        return 1;
 
    // Lancement de la capture
    alcCaptureStart(CaptureDevice);
 
    // On va stocker les échantillons capturés dans un tableau d'entiers signés 16 bits
    std::vector<ALshort> Samples;
 
 
    // On attend que l'utilisateur appuie sur entrée...
    std::cout << "Appuyez sur entree pour commencer 5 secondes de capture..." << std::endl;
    std::cin.ignore(10000, '\n');
    std::cin.ignore(10000, '\n');
 
    // ...Et c'est parti pour 5 secondes de capture
    time_t Start = time(NULL);
    while (time(NULL) - Start < 5)
    {
        // On récupère le nombre d'échantillons disponibles
        ALCint SamplesAvailable;
        alcGetIntegerv(CaptureDevice, ALC_CAPTURE_SAMPLES, 1, &SamplesAvailable);
 
 
 
        // On lit les échantillons et on les ajoute au tableau
        if (SamplesAvailable > 0)
        {
            std::string::size_type Start = Samples.size();
            Samples.resize(Start + SamplesAvailable);
            alcCaptureSamples(CaptureDevice, &Samples[Start], SamplesAvailable);
        }
 
    }
 
    // On stoppe la capture
    alcCaptureStop(CaptureDevice);
 
    // On n'oublie pas les éventuels échantillons qu'il reste à récupérer
    ALCint SamplesAvailable;
    alcGetIntegerv(CaptureDevice, ALC_CAPTURE_SAMPLES, 1, &SamplesAvailable);
    if (SamplesAvailable > 0)
    {
        std::string::size_type Start = Samples.size();
        Samples.resize(Start + SamplesAvailable);
        alcCaptureSamples(CaptureDevice, &Samples[Start], SamplesAvailable);
    }
 
    // On sauvegarde les échantillons capturés dans un fichier
    SaveSound("capture.wav", Samples);
 
    ofstream output(OUTPUTFILE);
    ofstream output1(OUTPUTFILE1);
    ofstream output2(OUTPUTFILE2);
 
    int samplessize;
    samplessize=Samples.size();
 
    realFFTData fftData(samplessize);
    realFFT rfft(&fftData);
 
  // read data into data and rdata :
  for (int i=0; i<samplessize; i++)
    fftData.in[i]=Samples[i];
 
  // forward transform :
  rfft.fwdTransform();
 
  // Find the power spectrum ...
  fftData.compPowerSpec();
  /*
  // inverse transform to check what happens (have to rescale too):
  rfft.invTransform();
  */
  // output to file :
  for (int i=0; i<(samplessize+1)/2; i++){
    output << fftData.power_spectrum[i]<<'\n';
  }
  //  cout <<(count+1)/2<<endl;
  output.close();
 
  for (int i=0; i<samplessize; i++){
    output1 << fftData.in[i]<<'\n';
    output2 << fftData.out[i]<<'\n';
  }
  output1.close();
  output2.close();
    // Fermeture de la capture
    ShutdownCapture();
 
    // Fermeture d'OpenAL
    ShutdownOpenAL();
 
    // On attend que l'utilisateur appuie sur entrée...
    std::cout << "Appuyez sur entree pour terminer..." << std::endl;
    std::cin.ignore(10000, '\n');
 
    return 0;
}
Qui me renvoie les erreurs suivantes:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
1>main.obj : error LNK2019: symbole externe non résolu "__declspec(dllimport) class std::basic_ostream<char,struct std::char_traits<char> > & __cdecl std::operator<<<char,struct std::char_traits<char> >(class std::basic_ostream<char,struct std::char_traits<char> > &,char const *)" (__imp_??$?6DU?$char_traits@D@std@@@std@@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@0@AAV10@PBD@Z) référencé dans la fonction "void __cdecl GetCaptureDevices(class std::vector<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class std::allocator<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > > > &)" (?GetCaptureDevices@@YAXAAV?$vector@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@@std@@@Z)
1>main.obj : error LNK2019: symbole externe non résolu "public: __thiscall realFFTData::~realFFTData(void)" (??1realFFTData@@QAE@XZ) référencé dans la fonction _main
1>main.obj : error LNK2019: symbole externe non résolu "public: __thiscall realFFT::~realFFT(void)" (??1realFFT@@QAE@XZ) référencé dans la fonction _main
1>main.obj : error LNK2019: symbole externe non résolu "__declspec(dllimport) class std::basic_ostream<char,struct std::char_traits<char> > & __cdecl std::operator<<<char,struct std::char_traits<char> >(class std::basic_ostream<char,struct std::char_traits<char> > &,char)" (__imp_??$?6DU?$char_traits@D@std@@@std@@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@0@AAV10@D@Z) référencé dans la fonction _main
1>main.obj : error LNK2019: symbole externe non résolu "public: int __thiscall realFFTData::compPowerSpec(void)" (?compPowerSpec@realFFTData@@QAEHXZ) référencé dans la fonction _main
1>main.obj : error LNK2019: symbole externe non résolu "public: void __thiscall realFFT::fwdTransform(void)" (?fwdTransform@realFFT@@QAEXXZ) référencé dans la fonction _main
1>main.obj : error LNK2019: symbole externe non résolu "public: __thiscall realFFT::realFFT(class realFFTData *)" (??0realFFT@@QAE@PAVrealFFTData@@@Z) référencé dans la fonction _main
1>main.obj : error LNK2019: symbole externe non résolu "public: __thiscall realFFTData::realFFTData(int)" (??0realFFTData@@QAE@H@Z) référencé dans la fonction _main
1>main.obj : error LNK2019: symbole externe non résolu "__declspec(dllimport) public: __thiscall std::basic_ofstream<char,struct std::char_traits<char> >::basic_ofstream<char,struct std::char_traits<char> >(char const *,int)" (__imp_??0?$basic_ofstream@DU?$char_traits@D@std@@@std@@QAE@PBDH@Z) référencé dans la fonction _main
1>C:\Documents and Settings\aal\Bureau\Ej\Debug\Ej.exe : fatal error LNK1120: 9 externes non résolus
Je travaille sous VC++ 2008 express edition.
Je ne comprend pas bien les bibliothèques fftw3 et fftw sont liées et toujours ces problèmes de std qui maintenant apparaissent à la génération et plus à la compilation...
Avez vous des suggestions ?
Merci
Cordialement
Gate 35