private void initMicrophoneWorker(Mixer.Info mixer, int sampleSize) throws LineUnavailableException, IllegalArgumentException {

        if (microphoneWorker != null) {
            microphoneWorker.shutdown();

            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

        microphoneWorker = MicrophoneWorkerFactory.createMicrophoneWorker(mixer, sampleSize);

        microphoneWorker.addPropertyChangeListener(new PropertyChangeListener() {
            @Override
            public void propertyChange(PropertyChangeEvent evt) {
                if ("progress".equals(evt.getPropertyName())) {
                    noiseLevel = (Integer) evt.getNewValue();

                    if (noiseLevel < progressBar1.getMinimum()) noiseLevel = progressBar1.getMinimum();
                    if (noiseLevel > progressBar1.getMaximum()) noiseLevel = progressBar1.getMaximum();

                    progressBar1.setValue(noiseLevel);

                    if (noiseLevel >= slider1.getValue()) {
                        judge.gainSound();
                        pressingStatus.setBackground(Color.green);

                    } else {
                        judge.loseSound();
                    }

                    if (!judge.hearsTalking()) {
                        pressingStatus.setBackground(Color.darkGray);
                    }

                    if (!judge.isMutedForSneeze()) {
                        sneezeStatus.setBackground(Color.darkGray);
                    }

                    deadMicDetector.lookAlive();
                }
            }
        });

        microphoneWorker.execute();
    }