PySDL3 & OpenGL: Audio Integration PySDL3 и OpenGL: Интеграция аудио

A guide to initializing audio via SDL3_mixer while maintaining an OpenGL rendering context. Руководство по инициализации аудио через SDL3_mixer при сохранении контекста рендеринга OpenGL.

1. Installation 1. Установка

Ensure you have Python installed. Install PySDL3 and PyOpenGL using pip:

Убедитесь, что у вас установлен Python. Установите PySDL3 и PyOpenGL через pip:

pip install PySDL3 PyOpenGL

2. Assets 2. Ресурсы

Before creating the files, download the required asset: Перед созданием файлов скачайте необходимый ресурс:

3. Project Structure 3. Структура проекта

pysdl3-mixer-opengl-app/
├── assets/audio/
│   └── Picked Coin Echo 2.wav
└── main.py

4. Source Code (OpenGL + Audio) 4. Исходный код (OpenGL + Аудио)

Combine video and audio initialization within the SDL_AppInit callback:

Объедините инициализацию видео и аудио в обратном вызове SDL_AppInit:

import os
import ctypes
import OpenGL.GL as gl

os.environ["SDL_MAIN_USE_CALLBACKS"] = "1"
os.environ["SDL_RENDER_DRIVER"] = "opengl"
import sdl3

# Global pointers for state
window = None
gl_context = None
mixer = None
audio = None
track = None

@sdl3.SDL_AppInit_func
def SDL_AppInit(appstate, argc, argv):
    global window, gl_context, mixer, audio, track

    # Initialize Video AND Audio
    if not sdl3.SDL_Init(sdl3.SDL_INIT_VIDEO | sdl3.SDL_INIT_AUDIO):
        return sdl3.SDL_APP_FAILURE

    # OpenGL Setup
    sdl3.SDL_GL_SetAttribute(sdl3.SDL_GL_MULTISAMPLEBUFFERS, 1)
    sdl3.SDL_GL_SetAttribute(sdl3.SDL_GL_MULTISAMPLESAMPLES, 2)
    
    window = sdl3.SDL_CreateWindow(b"PySDL3 OpenGL + Audio", 350, 350, sdl3.SDL_WINDOW_OPENGL)
    gl_context = sdl3.SDL_GL_CreateContext(window)
    sdl3.SDL_GL_SetSwapInterval(1)

    # Audio Setup (SDL3_mixer)
    if not sdl3.MIX_Init():
        return sdl3.SDL_APP_FAILURE

    mixer = sdl3.MIX_CreateMixerDevice(sdl3.SDL_AUDIO_DEVICE_DEFAULT_PLAYBACK, None)
    if not mixer:
        return sdl3.SDL_APP_FAILURE

    audio = sdl3.MIX_LoadAudio(mixer, b"assets/audio/Picked Coin Echo 2.wav", True)
    if not audio:
        return sdl3.SDL_APP_FAILURE

    track = sdl3.MIX_CreateTrack(mixer)
    sdl3.MIX_SetTrackAudio(track, audio)
    sdl3.MIX_PlayTrack(track, 0)

    return sdl3.SDL_APP_CONTINUE

@sdl3.SDL_AppEvent_func
def SDL_AppEvent(appstate, event):
    if sdl3.SDL_DEREFERENCE(event).type == sdl3.SDL_EVENT_QUIT:
        return sdl3.SDL_APP_SUCCESS
    return sdl3.SDL_APP_CONTINUE

@sdl3.SDL_AppIterate_func
def SDL_AppIterate(appstate):
    gl.glClearColor(0.2, 0.2, 0.2, 1)
    gl.glClear(gl.GL_COLOR_BUFFER_BIT)
    sdl3.SDL_GL_SwapWindow(window)
    return sdl3.SDL_APP_CONTINUE

@sdl3.SDL_AppQuit_func
def SDL_AppQuit(appstate, result):
    global gl_context, track, audio, mixer
    
    if track: sdl3.MIX_DestroyTrack(track)
    if audio: sdl3.MIX_DestroyAudio(audio)
    if mixer: sdl3.MIX_DestroyMixer(mixer)
    sdl3.MIX_Quit()
    
    if gl_context: sdl3.SDL_GL_DestroyContext(gl_context)
    if window: sdl3.SDL_DestroyWindow(window)
    sdl3.SDL_Quit()

5. Running the Application 5. Запуск приложения

Run the script via your terminal:

Запустите скрипт через терминал:

python main.py

Support My Work Поддержать проект

If these tutorials helped you, consider buying me a coffee! Если эти туториалы вам помогли, вы можете поддержать автора.

Sberbank (Russia only) Сбербанк (только для РФ)

Sberbank SBP QR Code

Direct transfer via phone number (Russia only) Перевод по номеру телефона (только для РФ)

+7 (917) 212-29-59

USDT TRC20

USDT TRC20 QR Code

Support via Cryptocurrency Поддержка криптовалютой

TMtY1YifNf6FKvgeFmqKGQR4NStKr3csGp