IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Objective-C Discussion :

Utiliser une fonction c++ dans une aplli cocoa [XCode]


Sujet :

Objective-C

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 84
    Points : 82
    Points
    82
    Par défaut Utiliser une fonction c++ dans une aplli cocoa
    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

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 84
    Points : 82
    Points
    82
    Par défaut
    Résolu, en fait ça se fait tout seul, il suffisait de bien gérer les imports.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 10
    Dernier message: 14/03/2009, 13h36
  2. [AJAX] [XAJAX] Lancer une fonction JS dans une fonction AJAX
    Par sixieme-sens dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 26/12/2008, 15h26
  3. Réponses: 1
    Dernier message: 25/10/2007, 21h25
  4. Réponses: 10
    Dernier message: 18/04/2007, 17h17
  5. [VBA-E] Une fonction Excel dans une fonction VBA
    Par laloune dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 14/07/2006, 10h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo