Ticket #8066: imuse.mutex.diff

File imuse.mutex.diff, 5.7 KB (added by SF/jamieson630, 19 years ago)

Patch against October 7 snapshot

  • scummvm/scumm/imuse.cpp

    RCS file: /cvsroot/scummvm/scummvm/scumm/imuse.cpp,v
    retrieving revision 1.39
    diff -u -r1.39 imuse.cpp
     
    323323        friend struct Player;
    324324private:
    325325        IMuseDriver * _driver;
     326        OSystem *_system;
    326327
    327328        byte **_base_sounds;
    328329
    329         byte _locked;
     330        void *_locked;
    330331        byte _hardware_type;
    331332
    332333private:
     
    759760
    760761void IMuseInternal::lock()
    761762{
    762         _locked++;
     763        _system->lock_mutex (_locked);
    763764}
    764765
    765766void IMuseInternal::unlock()
    766767{
    767         _locked--;
     768        _system->unlock_mutex (_locked);
    768769}
    769770
    770771byte *IMuseInternal::findTag(int sound, char *tag, int index)
     
    868869                        return false;
    869870                }
    870871        }
     872
     873        lock();
    871874        player = allocate_player(128);
    872         if (!player)
     875        if (!player) {
     876                unlock();
    873877                return false;
     878        }
    874879
    875880        player->clear();
    876         return player->start_sound(sound);
     881        bool ret = player->start_sound(sound);
     882        unlock();
     883        return ret;
    877884}
    878885
    879886
     
    955962
    956963        for (i = ARRAYSIZE(_players); i != 0; i--, player++) {
    957964                if (player->_active && player->_id == sound) {
     965                        lock();
    958966                        player->clear();
     967                        unlock();
    959968                        r = 0;
    960969                }
    961970        }
     
    967976        Player *player = _players;
    968977        int i;
    969978
     979        lock();
    970980        for (i = ARRAYSIZE(_players); i != 0; i--, player++) {
    971981                if (player->_active)
    972982                        player->clear();
    973983        }
     984        unlock();
    974985        return 0;
    975986}
    976987
    977988void IMuseInternal::on_timer()
    978989{
    979         if (_locked || _paused)
     990        if (_paused)
    980991                return;
    981992
    982993        lock();
     
    11901201                        // sound now?" So if the sound is about to fade out,
    11911202                        // shut it down and pretend it wasn't playing.
    11921203                        if (player->is_fading_out()) {
     1204                                lock();
    11931205                                player->clear();
     1206                                unlock();
    11941207                                continue;
    11951208                        }
    11961209                        return 1;
     
    13501363        vol = vol * _music_volume / 128;
    13511364
    13521365        _master_volume = vol;
     1366        lock();
    13531367        for (int i = 0; i != 8; i++)
    13541368                _channel_volume_eff[i] = (_channel_volume[i] + 1) * vol >> 7;
    13551369        update_volumes();
    13561370
     1371        unlock();
    13571372        return 0;
    13581373}
    13591374
     
    13781393                delete _driver;
    13791394                _driver = NULL;
    13801395        }
     1396        _system->delete_mutex (_locked);
    13811397        return 0;
    13821398        /* not implemented */
    13831399}
     
    14391455
    14401456                                for (i = ARRAYSIZE(_players), player = _players; i != 0; i--, player++) {
    14411457                                        if (player->_active && player->_id == (uint16)b) {
     1458                                                lock();
    14421459                                                player->fade_vol(e, f);
     1460                                                unlock();
    14431461                                                return 0;
    14441462                                        }
    14451463                                }
     
    14491467                                Player *player;
    14501468                                for (i = ARRAYSIZE(_players), player = _players; i != 0; i--, player++) {
    14511469                                        if (player->_active && player->_id == (uint16)b) {
     1470                                                lock();
    14521471                                                player->jump(player->_track_index + 1, 0, 0);
     1472                                                unlock();
    14531473                                                return 0;
    14541474                                        }
    14551475                                }
     
    14851505                        }
    14861506                }
    14871507
     1508                int32 ret = -1;
     1509                lock();
     1510
    14881511                switch (cmd) {
    14891512                case 0:
    1490                         return player->get_param(c, d);
     1513                        ret = player->get_param(c, d); break;
    14911514                case 1:
    14921515                        player->set_priority(c);
    1493                         return 0;
     1516                        ret = 0; break;
    14941517                case 2:
    1495                         return player->set_vol(c);
     1518                        ret = player->set_vol(c); break;
    14961519                case 3:
    14971520                        player->set_pan(c);
    1498                         return 0;
     1521                        ret = 0; break;
    14991522                case 4:
    1500                         return player->set_transpose(c, d);
     1523                        ret = player->set_transpose(c, d); break;
    15011524                case 5:
    15021525                        player->set_detune(c);
    1503                         return 0;
     1526                        ret = 0; break;
    15041527                case 6:
    15051528                        player->set_speed(c);
    1506                         return 0;
     1529                        ret = 0; break;
    15071530                case 7:
    1508                         return player->jump(c, d, e) ? 0 : -1;
     1531                        ret = player->jump(c, d, e) ? 0 : -1; break;
    15091532                case 8:
    1510                         return player->scan(c, d, e);
     1533                        ret = player->scan(c, d, e); break;
    15111534                case 9:
    1512                         return player->set_loop(c, d, e, f, g) ? 0 : -1;
     1535                        ret = player->set_loop(c, d, e, f, g) ? 0 : -1; break;
    15131536                case 10:
    15141537                        player->clear_loop();
    1515                         return 0;
     1538                        ret = 0; break;
    15161539                case 11:
    15171540                        ((Part *)player)->set_onoff(d != 0);
    1518                         return 0;
     1541                        ret = 0; break;
    15191542                case 12:
    1520                         return player->_hook.set(c, d, e);
     1543                        ret = player->_hook.set(c, d, e); break;
    15211544                case 13:
    1522                         return player->fade_vol(c, d);
     1545                        ret = player->fade_vol(c, d); break;
    15231546                case 14:
    1524                         return enqueue_trigger(b, c);
     1547                        ret = enqueue_trigger(b, c); break;
    15251548                case 15:
    1526                         return enqueue_command(b, c, d, e, f, g, h);
     1549                        ret = enqueue_command(b, c, d, e, f, g, h); break;
    15271550                case 16:
    1528                         return clear_queue();
     1551                        ret = clear_queue(); break;
    15291552                case 19:
    1530                         return player->get_param(c, d);
     1553                        ret = player->get_param(c, d); break;
    15311554                case 20:
    1532                         return player->_hook.set(c, d, e);
     1555                        ret = player->_hook.set(c, d, e); break;
    15331556                case 21:
    1534                         return -1;
     1557                        ret = -1; break;
    15351558                case 22:
    15361559                        ((Part *)player)->set_vol(d);
    1537                         return 0;
     1560                        ret = 0; break;
    15381561                case 23:
    1539                         return query_queue(b);
     1562                        ret = query_queue(b); break;
    15401563                case 24:
    1541                         return 0;
     1564                        ret = 0; break;
    15421565                default:
    15431566                        warning("IMuseInternal::do_command default midi command %d", cmd);
    1544                         return -1;
     1567                        ret = -1;
    15451568                }
     1569
     1570                unlock();
     1571                return ret;
    15461572        }
    15471573
    15481574        return -1;
     
    17131739                driv = new IMuseGM(midi);
    17141740        }
    17151741
     1742        _system = syst;
    17161743        _driver = driv;
    17171744        _hardware_type = driv->get_hardware_type();
    17181745        _game_tempo = driv->get_base_tempo();
    17191746
     1747        _locked = _system->create_mutex();
    17201748        driv->init(this, syst);
    17211749
    17221750        _master_volume = 127;
     
    30113039                MKEND()
    30123040        };
    30133041
     3042        lock();
     3043
    30143044        if (!ser->isSaving()) {
    30153045                stop_all_sounds();
    30163046        }
    30173047#ifdef _WIN32_WCE                                                               // Don't break savegames made with andys' build
    3018         if (!ser->isSaving() && ser->checkEOFLoadStream())
     3048        if (!ser->isSaving() && ser->checkEOFLoadStream()) {
     3049                unlock();
    30193050                return 0;
     3051        }
    30203052#endif
    30213053
    30223054        ser->_ref_me = this;
     
    30373069                _driver->update_pris();
    30383070        }
    30393071
     3072        unlock();
    30403073        return 0;
    30413074}
    30423075