Bonjour,

j'ai développé une DLL qui me permet de faire appel à des fonctions d'un DLL spécialisée dans le traitement audio (bass.dll). La première version de ma DLL fonction correctement mais ne fait pas appel à des classes. Notamment l'appel à la fonction Callback depuis la fonction SynchroPlaylist

Maintenant, je souhaite faire évoluer ma DLL et créer une classe Play_list. Tout semble Ok à l'exception du passage en paramètre de la fonction Callback dans la fonction SynchroPlaylist. J'ai bien lu dans certains forum que la technique à mettre en oeuvre est particulière mais mon niveau en C++ et POO ne m'a pas permis de saisir toutes les subtilités.

Afin que vous puissiez m'aider à trouver une solution je vous joins le code en question en question. En fait, je ne sais pas :
- quelle syntaxe utiliser pour faire l'appel de la callback et passer le paramètre à la fonction appelante.
- si un fonction callback peut faire partie d'une classe.

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
 
#include "stdafx.h"
#include "bass.h"
#include "bassmix.h"
#include <sstream> 
#include <string>  
#include <iostream>
#include <random>
#include <time.h>
 
 
class Play_list {
 
private:
	int rand_a_b(int a, int b);
	int* init_tableau(int a, int b);
	void melanger(int* tableau, int taille);
	std::string new_file_audio(std::string P_playlist, char P_separateur);
	void CALLBACK SyncProc(HSYNC handle, DWORD channel, DWORD data, void *user);
 
	std::string m_liste_fichier_audio;
	int m_nombre_fichier_audio; // Nombre total de fichiers audio dans la play list
	int* m_tab_playlist; // Tableau d'ordre de lecture de la playlist
	int cpt_tab; // Position interne de parcours de la playlist
 
public:
	void SynchroPlaylist(DWORD P_HDMixer, DWORD P_Flags, QWORD P_Param, DWORD P_Nb_File_audio, const char *P_PlayList, DWORD P_len_char, BOOL P_Lect_alea);
	int m_position_actuelle; // Position actuelle de lecture dans le tableau	
 
	DWORD m_mixer;
	DWORD m_source;
 
};
 
....
.....
 
// FUNCTION DE CALLBACK SPECIFIQUE BASS
//-------------------------------------
void CALLBACK Play_list::SyncProc(HSYNC handle, DWORD channel, DWORD data, void *user)
{
	HSTREAM l_next_stream=0;
	BOOL L_Return;
 
	std::string l_fic_audio = new_file_audio(m_liste_fichier_audio,';');
 
	l_next_stream = BASS_StreamCreateFile(false,l_fic_audio.c_str(),0,0,BASS_STREAM_DECODE|BASS_SAMPLE_FLOAT);
	L_Return = BASS_Mixer_StreamAddChannel(m_mixer, l_next_stream, BASS_STREAM_AUTOFREE|BASS_MIXER_NORAMPIN);
	L_Return = BASS_ChannelSetPosition(m_mixer,0,BASS_POS_BYTE);
}
 
void Play_list::SynchroPlaylist(DWORD P_HDMixer, DWORD P_Flags, QWORD P_Param, DWORD P_Nb_File_audio, const char *P_PlayList, DWORD P_len_char, BOOL P_Lect_alea)
{
 
	srand(time(NULL));
	m_liste_fichier_audio = P_PlayList;
	m_nombre_fichier_audio = P_Nb_File_audio;
	m_tab_playlist=init_tableau(1,P_Nb_File_audio);
 
	...
 
	std::string First_Fic_Audio = new_file_audio(m_liste_fichier_audio,';');
 
	m_mixer = BASS_Mixer_StreamCreate(44100,2,BASS_MIXER_END);
 
	BASS_ChannelSetSync(m_mixer,BASS_SYNC_END|BASS_SYNC_MIXTIME,0,Play_list::SyncProc,0);
 
	m_source = BASS_StreamCreateFile(false,First_Fic_Audio.c_str(),0,0,BASS_STREAM_DECODE|BASS_SAMPLE_FLOAT);  //1st file open	
	BASS_Mixer_StreamAddChannel(m_mixer,m_source,BASS_STREAM_AUTOFREE);
 
}
Même si je retire Play_list:: devant SynProc dans le code
Code : Sélectionner tout - Visualiser dans une fenêtre à part
BASS_ChannelSetSync(m_mixer,BASS_SYNC_END|BASS_SYNC_MIXTIME,0,Play_list::SyncProc,0);
une erreur est générée par le compilateur (qui est VS 2012)

Par avance merci de vos retours et de votre aide
Cordialement
Fabien