PyOpenAL (released Dec 17, 2019): https://pypi.org/project/PyOpenAL/
pip install PyOpenAL
You can use original OpenAL API but PyOpenAL has helpful wrapper functions. If your audio file plays with problems try to open it in the Audacity and export it with Encoding: Signed 16-bit PCM:

My example in PyQt6 shows how to load music, set looping, set volume, play music with QCheckBox and play sound with QPushButton. QSlider is here to set a volume:

pip install PyOpenAL PyQt6
import sys
from openal import oalOpen, oalQuit
from PyQt6.QtCore import Qt
from PyQt6.QtWidgets import (QApplication, QCheckBox, QHBoxLayout, QPushButton,
QSlider, QVBoxLayout, QWidget)
class Widget(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle("PyOpenAL, PyQt6")
self.resize(300, 150)
# Music check box
playMusic = QCheckBox("Play music")
# playMusic.toggle()
# print(playMusic.isChecked())
playMusic.stateChanged.connect(self.onPlayMusic)
# Sound button
playSoundButton = QPushButton("Play sound")
playSoundButton.clicked.connect(self.onPlaySound)
mousicVolume = 0.1
# Volume slider
volumeSlider = QSlider(Qt.Orientation.Horizontal)
volumeSlider.setValue(int(mousicVolume * 100))
volumeSlider.valueChanged[int].connect(self.onChangeVolume)
self.mousicSource = oalOpen("assets/infant_tour.wav")
self.soundSource = oalOpen("assets/bounce.wav")
self.mousicSource.set_gain(mousicVolume)
self.mousicSource.set_looping(True)
vbox = QVBoxLayout()
vbox.addWidget(volumeSlider)
vbox.addWidget(playMusic)
vbox.addWidget(playSoundButton)
vbox.addStretch(1)
hbox = QHBoxLayout()
hbox.addLayout(vbox)
hbox.addStretch(1)
self.setLayout(hbox)
def onPlayMusic(self, state):
if state == Qt.CheckState.Checked.value:
self.mousicSource.play()
else:
self.mousicSource.pause()
def onPlaySound(self):
self.soundSource.play()
def onChangeVolume(self, value):
self.mousicSource.set_gain(value / 100)
def closeEvent(self, event):
oalQuit()
if __name__ == "__main__":
app = QApplication(sys.argv)
w = Widget()
w.show()
sys.exit(app.exec())