18 #include "../stdafx.h" 
   19 #include "../os/macosx/macos.h" 
   24 #define Point       OTTDPoint 
   25 #include <CoreServices/CoreServices.h> 
   26 #include <AudioUnit/AudioUnit.h> 
   27 #include <AudioToolbox/AudioToolbox.h> 
   31 #include "../safeguards.h" 
   33 #if !defined(HAVE_OSX_1011_SDK) 
   34 #define kMusicSequenceFile_AnyType 0 
   40 static MusicPlayer    _player = NULL;
 
   41 static MusicSequence  _sequence = NULL;
 
   42 static MusicTimeStamp _seq_length = 0;
 
   43 static bool           _playing = 
false;
 
   44 static byte           _volume = 127;
 
   48 static void DoSetVolume()
 
   50   if (_sequence == NULL) 
return;
 
   53   MusicSequenceGetAUGraph(_sequence, &graph);
 
   55   AudioUnit output_unit = NULL;
 
   58   UInt32 node_count = 0;
 
   59   AUGraphGetNodeCount(graph, &node_count);
 
   60   for (UInt32 i = 0; i < node_count; i++) {
 
   62     AUGraphGetIndNode(graph, i, &node);
 
   67 #if (MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5) 
   75 #if defined(__AUDIOCOMPONENT_H__) || defined(HAVE_OSX_107_SDK) 
   76       AudioComponentDescription desc;
 
   78       ComponentDescription desc;
 
   80       AUGraphNodeInfo(graph, node, &desc, &unit);
 
   81       comp_type = desc.componentType;
 
   85 #if (MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5) 
   86       ComponentDescription desc;
 
   87       AUGraphGetNodeInfo(graph, node, &desc, NULL, NULL, &unit);
 
   88       comp_type = desc.componentType;
 
   92     if (comp_type == kAudioUnitType_Output) {
 
   97   if (output_unit == NULL) {
 
   98     DEBUG(driver, 1, 
"cocoa_m: Failed to get output node to set volume");
 
  102   Float32 vol = _volume / 127.0f;  
 
  103   AudioUnitSetParameter(output_unit, kHALOutputParam_Volume, kAudioUnitScope_Global, 0, vol, 0);
 
  112   if (NewMusicPlayer(&_player) != noErr) 
return "failed to create music player";
 
  123   if (!_playing) 
return false;
 
  125   MusicTimeStamp time = 0;
 
  126   MusicPlayerGetTime(_player, &time);
 
  127   return time < _seq_length;
 
  136   if (_player != NULL) DisposeMusicPlayer(_player);
 
  137   if (_sequence != NULL) DisposeMusicSequence(_sequence);
 
  148   DEBUG(driver, 2, 
"cocoa_m: trying to play '%s'", filename);
 
  151   if (_sequence != NULL) {
 
  152     DisposeMusicSequence(_sequence);
 
  156   if (NewMusicSequence(&_sequence) != noErr) {
 
  157     DEBUG(driver, 0, 
"cocoa_m: Failed to create music sequence");
 
  161   const char *os_file = 
OTTD2FS(filename);
 
  162   CFURLRef url = CFURLCreateFromFileSystemRepresentation(kCFAllocatorDefault, (
const UInt8*)os_file, strlen(os_file), 
false);
 
  164 #if (MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5) 
  166     if (MusicSequenceFileLoad(_sequence, url, kMusicSequenceFile_AnyType, 0) != noErr) {
 
  167       DEBUG(driver, 0, 
"cocoa_m: Failed to load MIDI file");
 
  174 #if (MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5) 
  176     if (!CFURLGetFSRef(url, &ref_file)) {
 
  177       DEBUG(driver, 0, 
"cocoa_m: Failed to make FSRef");
 
  181     if (MusicSequenceLoadSMFWithFlags(_sequence, &ref_file, 0) != noErr) {
 
  182       DEBUG(driver, 0, 
"cocoa_m: Failed to load MIDI file old style");
 
  191   AUGraph graph = NULL;
 
  193   MusicSequenceGetAUGraph(_sequence, &graph);
 
  195   if (AUGraphInitialize(graph) != noErr) {
 
  196     DEBUG(driver, 0, 
"cocoa_m: Failed to initialize AU graph");
 
  202   MusicSequenceGetTrackCount(_sequence, &num_tracks);
 
  204   for (UInt32 i = 0; i < num_tracks; i++) {
 
  205     MusicTrack     track = NULL;
 
  206     MusicTimeStamp track_length = 0;
 
  207     UInt32         prop_size = 
sizeof(MusicTimeStamp);
 
  208     MusicSequenceGetIndTrack(_sequence, i, &track);
 
  209     MusicTrackGetProperty(track, kSequenceTrackProperty_TrackLength, &track_length, &prop_size);
 
  210     if (track_length > _seq_length) _seq_length = track_length;
 
  216   MusicPlayerSetSequence(_player, _sequence);
 
  217   MusicPlayerPreroll(_player);
 
  218   if (MusicPlayerStart(_player) != noErr) 
return;
 
  221   DEBUG(driver, 3, 
"cocoa_m: playing '%s'", filename);
 
  230   MusicPlayerStop(_player);
 
  231   MusicPlayerSetSequence(_player, NULL);