@Override
    public void playSource(AudioSource src) {
        checkDead();
        synchronized (threadLock) {
            if (audioDisabled) {
                return;
            }

            if (src.getStatus() == Status.Playing) {
                // Already playing, do nothing.
                return;
            }

            if (src.getStatus() == Status.Stopped) {

                AudioData audioData = src.getAudioData();
                if (audioData == null) {
                    logger.log(Level.WARNING, "playSource called on source with null AudioData: {0}", src);
                    return;
                }

                // Allocate a temporary channel
                int index = newChannel();
                if (index == -1) {
                    logger.log(Level.WARNING, "No channel available to play instance of {0}", src);
                    return;
                }

                // Ensure channel is clean before use
                int sourceId = channels[index];
                clearChannel(index);
                src.setChannel(index);

                if (audioData.isUpdateNeeded()) {
                    updateAudioData(audioData);
                }

                // Set all source parameters and attach the audio data
                channelSources[index] = src;
                setSourceParams(sourceId, src, false);
                attachAudioToSource(sourceId, audioData, src.isLooping());
            }

            // play the channel
            int sourceId = channels[src.getChannel()];
            al.alSourcePlay(sourceId);
            src.setStatus(Status.Playing); // Update JME status
        }
    }
Plays an audio source, allocating a persistent channel for it.
Handles both buffers and streams. Can be paused and stopped.
@param src The audio source to play.
jme3-core/src/main/java/com/jme3/audio/openal/ALAudioRenderer.java