Bonjour à tous, je tente de faire fonctionner un bout de code en c++
au sein d'une appli cocoa.

Je souhaite donc appeler une fonction c++ qui se trouve dans un fichier cpp depuis une classe objC

Le but est d'appeler la fonction test() du fichier Music.cpp

Le programme compile et se lance, mais lorsque je clique sur le bouton bt1 rien ne se passe alors que le code fonctionne si je l'appelle d'une "main" en c++


voici les fichiers pour vous permettre de voir l'erreur.

La classe SCCPerso.mm tente d'appeler la fonction test();

Merci pour vos éclairage.

Music.h

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
//
//  Music.h
//  test26
//
//  Created by Lion User on 14/03/13.
//  Copyright (c) 2013 Lion User. All rights reserved.
//
//#ifdef _cplusplus
#ifndef __test26__Music__
#define __test26__Music__
 
#include <iostream>
 
#endif /* defined(__test26__Music__) */
int test();
 
//#endif
Music.cpp qui contient la fonction à appeler.

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
//
//  Music.cpp
//  test26
//
//  Created by Lion User on 14/03/13.
//  Copyright (c) 2013 Lion User. All rights reserved.
//
 
 
#ifdef _cplusplus
#include "Music.h"
#include <CoreServices/CoreServices.h> //for file stuff
#include <AudioUnit/AudioUnit.h>
#include <AudioToolbox/AudioToolbox.h> //for AUGraph
#include <unistd.h> // used for usleep...
 
// This call creates the Graph and the Synth unit...
OSStatus	CreateAUGraph (AUGraph &outGraph, AudioUnit &outSynth)
{
	OSStatus result;
	//create the nodes of the graph
	AUNode synthNode, limiterNode, outNode;
 
	AudioComponentDescription cd;
	cd.componentManufacturer = kAudioUnitManufacturer_Apple;
	cd.componentFlags = 0;
	cd.componentFlagsMask = 0;
 
	require_noerr (result = NewAUGraph (&outGraph), home);
 
	cd.componentType = kAudioUnitType_MusicDevice;
	cd.componentSubType = kAudioUnitSubType_DLSSynth;
 
	require_noerr (result = AUGraphAddNode (outGraph, &cd, &synthNode), home);
 
	cd.componentType = kAudioUnitType_Effect;
	cd.componentSubType = kAudioUnitSubType_PeakLimiter;
 
	require_noerr (result = AUGraphAddNode (outGraph, &cd, &limiterNode), home);
 
	cd.componentType = kAudioUnitType_Output;
	cd.componentSubType = kAudioUnitSubType_DefaultOutput;
	require_noerr (result = AUGraphAddNode (outGraph, &cd, &outNode), home);
 
	require_noerr (result = AUGraphOpen (outGraph), home);
 
	require_noerr (result = AUGraphConnectNodeInput (outGraph, synthNode, 0, limiterNode, 0), home);
	require_noerr (result = AUGraphConnectNodeInput (outGraph, limiterNode, 0, outNode, 0), home);
 
	// ok we're good to go - get the Synth Unit...
	require_noerr (result = AUGraphNodeInfo(outGraph, synthNode, 0, &outSynth), home);
 
home:
	return result;
}
 
// some MIDI constants:
enum {
	kMidiMessage_ControlChange 		= 0xB,
	kMidiMessage_ProgramChange 		= 0xC,
	kMidiMessage_BankMSBControl 	= 0,
	kMidiMessage_BankLSBControl		= 32,
	kMidiMessage_NoteOn 			= 0x9
};
 
 
int test() {
 
	AUGraph graph = 0;
	AudioUnit synthUnit;
	OSStatus result;
	char* bankPath = 0;
 
	UInt8 midiChannelInUse = 0; //we're using midi channel 1...
 
    // this is the only option to main that we have...
    // just the full path of the sample bank...
 
    // On OS X there are known places were sample banks can be stored
    // Library/Audio/Sounds/Banks - so you could scan this directory and give the user options
    // about which sample bank to use...
	//if (argc > 1)		bankPath = const_cast<char*>(argv[1]);
 
	require_noerr (result = CreateAUGraph (graph, synthUnit), home);
 
    // if the user supplies a sound bank, we'll set that before we initialize and start playing
	if (bankPath)
	{
		FSRef fsRef;
		require_noerr (result = FSPathMakeRef ((const UInt8*)bankPath, &fsRef, 0), home);
 
		printf ("Setting Sound Bank:%s\n", bankPath);
 
		require_noerr (result = AudioUnitSetProperty (synthUnit,
                                                      kMusicDeviceProperty_SoundBankFSRef,
                                                      kAudioUnitScope_Global, 0,
                                                      &fsRef, sizeof(fsRef)), home);
 
	}
 
	// ok we're set up to go - initialize and start the graph
	require_noerr (result = AUGraphInitialize (graph), home);
 
    //set our bank
	require_noerr (result = MusicDeviceMIDIEvent(synthUnit,
                                                 kMidiMessage_ControlChange << 4 | midiChannelInUse,
                                                 kMidiMessage_BankMSBControl, 0,
                                                 0/*sample offset*/), home);
 
	require_noerr (result = MusicDeviceMIDIEvent(synthUnit,
                                                 kMidiMessage_ProgramChange << 4 | midiChannelInUse,
                                                 0/*prog change num*/, 0,
                                                 0/*sample offset*/), home);
 
	CAShow (graph); // prints out the graph so we can see what it looks like...
 
	require_noerr (result = AUGraphStart (graph), home);
 
	// we're going to play an octave of MIDI notes: one a second
	for (int i = 0; i < 4; i++) {
		//UInt32 noteNum = i + 60;
		UInt32 onVelocity = 127;
		UInt32 noteOnCommand = 	kMidiMessage_NoteOn << 4 | midiChannelInUse;
 
		require_noerr (result = MusicDeviceMIDIEvent(synthUnit, noteOnCommand, 60, onVelocity, 0), home);
        require_noerr (result = MusicDeviceMIDIEvent(synthUnit, noteOnCommand, 65, onVelocity, 0), home);
        require_noerr (result = MusicDeviceMIDIEvent(synthUnit, noteOnCommand, 68, onVelocity, 0), home);
 
        // sleep for a second
		usleep (1 * 1000 * 1000);
 
		require_noerr (result = MusicDeviceMIDIEvent(synthUnit, noteOnCommand, 60, 0, 0), home);
        require_noerr (result = MusicDeviceMIDIEvent(synthUnit, noteOnCommand, 65, 0, 0), home);
        require_noerr (result = MusicDeviceMIDIEvent(synthUnit, noteOnCommand, 68, 0, 0), home);
	}
 
	// ok we're done now
 
home:
	if (graph) {
		AUGraphStop (graph); // stop playback - AUGraphDispose will do that for us but just showing you what to do
		DisposeAUGraph (graph);
	}
	return result;
 
}
#endif
La classe qui appelle

SCCPerso.h

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
//
//  SCCPerso.h
//  test26
//
//  Created by Lion User on 14/03/13.
//  Copyright (c) 2013 Lion User. All rights reserved.
//
 
#import <Foundation/Foundation.h>
#import "Music.h"
@interface SCCPerso : NSObject
- (IBAction)bt1:(id)sender;
 
@end
et l'implementation

SCCPerso.mm

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
//
//  SCCPerso.m
//  test26
//
//  Created by Lion User on 14/03/13.
//  Copyright (c) 2013 Lion User. All rights reserved.
//
 
#import "SCCPerso.h"
 
@implementation SCCPerso
 
- (IBAction)bt1:(id)sender {
    #ifdef _cplusplus
  int a=  test();
    #endif
}
@end