Hi,
a friend of mine has already done the GUI, file-management etc. for an audio sequencer specifically designed for placing audio sources in 3d space and animating them. He has done this based on Apples Frameworks (Cocoa & co.). I’d like to (try to) write the missing piece, an “audio engine” for it, using Juce (It’s actually part of my semester thesis).
The connection between these two worlds is a class defined in a *.h and *.mm file, where Objective-C and C++ can be used side by side. In the constructor of this class, an object of type AmbisonicsAudioEngine - which is my “audio engine” - is initialized.
So far, everything is working. But as soon as I also wan’t to call a member function of this AmbisonicsAudioEngine object (meaning: as soon as Juce really gets involved), the GDB interrupts the application startup:
Loading program into debugger…
Program loaded.
run
[Switching to process 3310]
Running…
JUCE Assertion failure in /Users/sam/data/on_sam7/res/projects_dev/juce100311/juce/build/macosx/…/…/src/events/juce_MessageListener.cpp, line 37
Debugger() was called!
sharedlibrary apply-load-rules all
(gdb)
I think this happens because Juce is not initialised. But how to do this? And where to place it in the objective-c code? In a pure Juce Application, the macro START_JUCE_APPLICATION takes care of this - i think. But in this project, there is already a starting point…
Some more insights:
The “audio engine” is as simple as possible for now. It’s only capable of playing back one single audio file, which has to be chosen. Using it with a Juce GUI works fine, by the way.
AmbisonicsAudioEngine.h
#ifndef __AMBISONICS_AUDIO_ENGINE
#define __AMBISONICS_AUDIO_ENGINE
#include "JuceLibraryCode/JuceHeader.h"
class AmbisonicsAudioEngine
{
public:
// constructor
AmbisonicsAudioEngine ();
// destructor
~AmbisonicsAudioEngine ();
// This opens a dialogWindow to set up the audioDeviceManager
void showAudioSettings();
void start();
void stop();
// Temp
// This opens a dialogWindow to choose the audio file
bool chooseAudioFile();
private:
AudioDeviceManager audioDeviceManager;
AudioSourcePlayer audioSourcePlayer;
AudioTransportSource audioTransportSource;
AudioFormatReaderSource* currentAudioFileSource;
};
#endif // __AMBISONICS_AUDIO_ENGINE
and a snippet of AmbisonicsAudioEngine.cpp
void AmbisonicsAudioEngine::showAudioSettings()
{
AudioDeviceSelectorComponent audioDeviceSelectorComponent (audioDeviceManager,
0, 256,
0, 256,
true, true, true, false);
audioDeviceSelectorComponent.setSize (500, 450);
DialogWindow::showModalDialog (T("Audio Settings"),
&audioDeviceSelectorComponent,
0,
Colours::lightgrey,
true);
}