    //=============================================================================
    //  MuseScore
    //  Music Composition & Notation
    //
    //  Copyright (C) 2002-2012 Werner Schweer
    //
    //  This program is free software; you can redistribute it and/or modify
    //  it under the terms of the GNU General Public License version 2
    //  as published by the Free Software Foundation and appearing in
    //  the file LICENCE.GPL
    //=============================================================================

    #include "config.h"
    #include "preferences.h"
    #include "driver.h"

    #ifdef USE_JACK
    #include "jackaudio.h"
    #endif

    #ifdef USE_ALSA
    #include "alsa.h"
    #endif
    #ifdef USE_PORTAUDIO
    #include "pa.h"
    #endif

    namespace Ms {

    #ifdef USE_PULSEAUDIO
    extern Driver* getPulseAudioDriver(Seq*);
    #endif

    //---------------------------------------------------------
    //   driverFactory
    //    driver can be: jack alsa pulse portaudio
    //---------------------------------------------------------

    Driver* driverFactory(Seq* seq, QString driverName)
          {
          Driver* driver = 0;
    #if 1 // DEBUG: force "no audio"
          bool useJackFlag       = (preferences.useJackAudio || preferences.useJackMidi);
          bool useAlsaFlag       = preferences.useAlsaAudio;
          bool usePortaudioFlag  = preferences.usePortaudioAudio;
          bool usePulseAudioFlag = preferences.usePulseAudio;

          if (!driverName.isEmpty()) {
                driverName        = driverName.toLower();
                useJackFlag       = false;
                useAlsaFlag       = false;
                usePortaudioFlag  = false;
                usePulseAudioFlag = false;
                if (driverName == "jack")
                      useJackFlag = true;
                else if (driverName == "alsa")
                      useAlsaFlag = true;
                else if (driverName == "pulse")
                      usePulseAudioFlag = true;
                else if (driverName == "portaudio")
                      usePortaudioFlag = true;
                }

          useALSA       = false;
          useJACK       = false;
          usePortaudio  = false;
          usePulseAudio = false;

    #ifdef USE_PULSEAUDIO
          if (usePulseAudioFlag) {
                driver = getPulseAudioDriver(seq);
                if (!driver->init()) {
                      qDebug("init PulseAudio failed");
                      delete driver;
                      driver = 0;
                      }
                else
                      usePulseAudio = true;
                }
    #else
          (void)usePulseAudioFlag; // avoid compiler warning
    #endif
    #ifdef USE_PORTAUDIO
          if (usePortaudioFlag) {
                driver = new Portaudio(seq);
                if (!driver->init()) {
                      qDebug("init PortAudio failed");
                      delete driver;
                      driver = 0;
                      }
                else
                      usePortaudio = true;
                }
    #else
          (void)usePortaudioFlag; // avoid compiler warning
    #endif
    #ifdef USE_ALSA
          if (driver == 0 && useAlsaFlag) {
                driver = new AlsaAudio(seq);
                if (!driver->init()) {
                      qDebug("init ALSA driver failed");
                      delete driver;
                      driver = 0;
                      }
                else {
                      useALSA = true;
                      }
                }
    #else
          (void)useAlsaFlag; // avoid compiler warning
    #endif
    #ifdef USE_JACK
          if (useJackFlag) {
                useAlsaFlag      = false;
                usePortaudioFlag = false;
                driver = new JackAudio(seq);
                if (!driver->init()) {
                      qDebug("no JACK server found");
                      delete driver;
                      driver = 0;
                      }
                else
                      useJACK = true;
                }
    #else
           (void)useJackFlag; // avoid compiler warning
    #endif
    #endif
          if (driver == 0)
                qDebug("no audio driver found");

          return driver;
          }

    }

↑ V773 The 'driver' pointer was assigned values twice without releasing the memory. A memory leak is possible.