Skip to main content

python bindings for the miniaudio library and its decoders (mp3, flac, ogg vorbis, wav)

Project description

Latest Version

Python miniaudio

Multiplatform audio playback, recording, decoding and sample format conversion for Linux (including Raspberri Pi), Windows, Mac and others.

Installation for most users: via Pypi, Raspberri Pi builds via PiWheels.

This is a Pythonic interface to the cross-platform miniaudio C library:

  • audio operations run in the background
  • python bindings for most of the functions offered in the miniaudio library:
    • reading and decoding audio files
    • getting audio file properties (such as duration, number of channels, sample rate)
    • converting sample formats and frequencies
    • streaming large audio files
    • audio playback
    • audio recording
  • decoders for wav, flac, vorbis and mp3
  • Audio file and Icecast internet radio streaming
  • Python enums instead of just some integers for special values
  • several classes to represent the main functions of the library
  • generators for the Audio playback and recording
  • sample data is usually in the form of a Python array with appropriately sized elements depending on the sample width (rather than a raw block of bytes)
  • TODO: filters, waveform generators?

Requires Python 3.10 or newer. Also works on pypy3 (because it uses cffi).

The miniaudio C library version is 0.11.25.

Software license for these Python bindings, miniaudio and the decoders: MIT

Synthesizer, modplayer?

If you like this library you may also be interested in my software FM synthesizer or my mod player which uses libxmp.

Examples

Basic audio file playback with info

import miniaudio

# Get file info
info = miniaudio.get_file_info("samples/music.mp3")
print(f"Playing: {info.nchannels} channels, {info.sample_rate} Hz, {info.duration:.1f}s")

# Stream and play
stream = miniaudio.stream_file("samples/music.mp3")
with miniaudio.PlaybackDevice() as device:
    device.start(stream)
    input("Playing... press Enter to stop")

Decode and convert audio file

import miniaudio

# Decode audio file to float32
sound = miniaudio.decode_file("music.mp3", miniaudio.SampleFormat.FLOAT32)
print(f"Decoded: {sound.nchannels} ch, {sound.sample_rate} Hz, {sound.num_frames} frames")

# Convert to different format and sample rate
converted = miniaudio.convert_frames(
    sound.sample_format, sound.nchannels, sound.sample_rate,
    sound.samples.tobytes(),
    miniaudio.SampleFormat.SIGNED16, sound.nchannels, 22050
)

# Write to WAV file
miniaudio.wav_write_file("output.wav", miniaudio.DecodedSoundFile(
    "output.wav", sound.nchannels, 22050, miniaudio.SampleFormat.SIGNED16,
    converted
))
print("Written to output.wav")

Playback of an unsupported file format

This example uses ffmpeg as an external tool to decode an audio file in a format that miniaudio itself can't decode (m4a/aac in this case):

import subprocess
import miniaudio

channels = 2
sample_rate = 44100
sample_width = 2  # 16 bit pcm
filename = "samples/music.m4a"  # AAC encoded audio file

def stream_pcm(source):
    required_frames = yield b""  # generator initialization
    while True:
        required_bytes = required_frames * channels * sample_width
        sample_data = source.read(required_bytes)
        if not sample_data:
            break
        print(".", end="", flush=True)
        required_frames = yield sample_data

with miniaudio.PlaybackDevice(output_format=miniaudio.SampleFormat.SIGNED16,
                              nchannels=channels, sample_rate=sample_rate) as device:
    ffmpeg = subprocess.Popen(["ffmpeg", "-v", "fatal", "-hide_banner", "-nostdin",
                               "-i", filename, "-f", "s16le", "-acodec", "pcm_s16le",
                               "-ac", str(channels), "-ar", str(sample_rate), "-"],
                              stdin=None, stdout=subprocess.PIPE)
    stream = stream_pcm(ffmpeg.stdout)
    next(stream)  # start the generator
    device.start(stream)
    input("Audio file playing in the background. Enter to stop playback: ")
    ffmpeg.terminate()

API

Note: everything below is automatically generated from comments in the source code files. Do not edit in this readme directly.

enum class Backend names: WASAPI DSOUND WINMM COREAUDIO SNDIO AUDIO4 OSS PULSEAUDIO ALSA JACK AAUDIO OPENSL WEBAUDIO CUSTOM NULL

Operating system audio backend to use (only a subset will be available)

enum class ChannelMixMode names: RECTANGULAR SIMPLE CUSTOMWEIGHTS

How to mix channels when converting

enum class DeviceType names: PLAYBACK CAPTURE DUPLEX

Type of audio device

enum class DitherMode names: NONE RECTANGLE TRIANGLE

How to dither when converting

enum class FileFormat names: UNKNOWN WAV FLAC MP3 VORBIS

Audio file format

enum class SampleFormat names: UNKNOWN UNSIGNED8 SIGNED16 SIGNED24 SIGNED32 FLOAT32

Sample format in memory

enum class SeekOrigin names: START CURRENT END

How to seek() in a source

enum class ThreadPriority names: IDLE LOWEST LOW NORMAL HIGH HIGHEST REALTIME

The priority of the worker thread (default=HIGHEST)

function convert_frames (from_fmt: miniaudio.SampleFormat, from_numchannels: int, from_samplerate: int, sourcedata: bytes, to_fmt: miniaudio.SampleFormat, to_numchannels: int, to_samplerate: int) -> bytearray

Convert audio frames in source sample format with a certain number of channels, to another sample format and possibly down/upmixing the number of channels as well.

function convert_sample_format (from_fmt: miniaudio.SampleFormat, sourcedata: bytes, to_fmt: miniaudio.SampleFormat, dither: miniaudio.DitherMode = <DitherMode.NONE: 0>) -> bytearray

Convert a raw buffer of pcm samples to another sample format. The result is returned as another raw pcm sample buffer

function decode (data: bytes, output_format: miniaudio.SampleFormat = <SampleFormat.SIGNED16: 2>, nchannels: int = 2, sample_rate: int = 44100, dither: miniaudio.DitherMode = <DitherMode.NONE: 0>) -> miniaudio.DecodedSoundFile

Convenience function to decode any supported audio file in memory to raw PCM samples in your chosen format.

function decode_file (filename: str, output_format: miniaudio.SampleFormat = <SampleFormat.SIGNED16: 2>, nchannels: int = 2, sample_rate: int = 44100, dither: miniaudio.DitherMode = <DitherMode.NONE: 0>) -> miniaudio.DecodedSoundFile

Convenience function to decode any supported audio file to raw PCM samples in your chosen format.

function flac_get_file_info (filename: str) -> miniaudio.SoundFileInfo

Fetch some information about the audio file (flac format).

function flac_get_info (data: bytes) -> miniaudio.SoundFileInfo

Fetch some information about the audio data (flac format).

function flac_read_f32 (data: bytes) -> miniaudio.DecodedSoundFile

Reads and decodes the whole flac audio file. Resulting sample format is 32 bits float.

function flac_read_file_f32 (filename: str) -> miniaudio.DecodedSoundFile

Reads and decodes the whole flac audio file. Resulting sample format is 32 bits float.

function flac_read_file_s16 (filename: str) -> miniaudio.DecodedSoundFile

Reads and decodes the whole flac audio file. Resulting sample format is 16 bits signed integer.

function flac_read_file_s32 (filename: str) -> miniaudio.DecodedSoundFile

Reads and decodes the whole flac audio file. Resulting sample format is 32 bits signed integer.

function flac_read_s16 (data: bytes) -> miniaudio.DecodedSoundFile

Reads and decodes the whole flac audio data. Resulting sample format is 16 bits signed integer.

function flac_read_s32 (data: bytes) -> miniaudio.DecodedSoundFile

Reads and decodes the whole flac audio data. Resulting sample format is 32 bits signed integer.

function flac_stream_file (filename: str, frames_to_read: int = 1024, seek_frame: int = 0) -> Generator[array.array, NoneType, NoneType]

Streams the flac audio file as interleaved 16 bit signed integer sample arrays segments. This uses a fixed chunk size and cannot be used as a generic miniaudio decoder input stream. Consider using stream_file() instead.

function get_enabled_backends () -> Set[miniaudio.Backend]

Returns the set of available backends by the compilation environment for the underlying miniaudio C library

function get_file_info (filename: str) -> miniaudio.SoundFileInfo

Fetch some information about the audio file.

function is_backend_enabled (backend: miniaudio.Backend) -> bool

Determines whether or not the given backend is available by the compilation environment for the underlying miniaudio C library

function is_loopback_supported (backend: miniaudio.Backend) -> bool

Determines whether or not loopback mode is support by a backend.

function lib_version () -> str

Returns the version string of the underlying miniaudio C library

function mp3_get_file_info (filename: str) -> miniaudio.SoundFileInfo

Fetch some information about the audio file (mp3 format).

function mp3_get_info (data: bytes) -> miniaudio.SoundFileInfo

Fetch some information about the audio data (mp3 format).

function mp3_read_f32 (data: bytes) -> miniaudio.DecodedSoundFile

Reads and decodes the whole mp3 audio data. Resulting sample format is 32 bits float.

function mp3_read_file_f32 (filename: str) -> miniaudio.DecodedSoundFile

Reads and decodes the whole mp3 audio file. Resulting sample format is 32 bits float.

function mp3_read_file_s16 (filename: str) -> miniaudio.DecodedSoundFile

Reads and decodes the whole mp3 audio file. Resulting sample format is 16 bits signed integer.

function mp3_read_s16 (data: bytes) -> miniaudio.DecodedSoundFile

Reads and decodes the whole mp3 audio data. Resulting sample format is 16 bits signed integer.

function mp3_stream_file (filename: str, frames_to_read: int = 1024, seek_frame: int = 0) -> Generator[array.array, NoneType, NoneType]

Streams the mp3 audio file as interleaved 16 bit signed integer sample arrays segments. This uses a fixed chunk size and cannot be used as a generic miniaudio decoder input stream. Consider using stream_file() instead.

function read_file (filename: str, convert_to_16bit: bool = False) -> miniaudio.DecodedSoundFile

Reads and decodes the whole audio file. Miniaudio will attempt to return the sound data in exactly the same format as in the file. Unless you set convert_convert_to_16bit to True, then the result is always a 16 bit sample format.

function stream_any (source: miniaudio.StreamableSource, source_format: miniaudio.FileFormat = <FileFormat.UNKNOWN: 0>, output_format: miniaudio.SampleFormat = <SampleFormat.SIGNED16: 2>, nchannels: int = 2, sample_rate: int = 44100, frames_to_read: int = 1024, dither: miniaudio.DitherMode = <DitherMode.NONE: 0>, seek_frame: int = 0) -> Generator[array.array, int, NoneType]

Convenience function that returns a generator to decode and stream any source of encoded audio data (such as a network stream). Stream result is chunks of raw PCM samples in the chosen format. If you send() a number into the generator rather than just using next() on it, you'll get that given number of frames, instead of the default configured amount. This is particularly useful to plug this stream into an audio device callback that wants a variable number of frames per call.

function stream_file (filename: str, output_format: miniaudio.SampleFormat = <SampleFormat.SIGNED16: 2>, nchannels: int = 2, sample_rate: int = 44100, frames_to_read: int = 1024, dither: miniaudio.DitherMode = <DitherMode.NONE: 0>, seek_frame: int = 0) -> Generator[array.array, int, NoneType]

Convenience generator function to decode and stream any supported audio file as chunks of raw PCM samples in the chosen format. If you send() a number into the generator rather than just using next() on it, you'll get that given number of frames, instead of the default configured amount. This is particularly useful to plug this stream into an audio device callback that wants a variable number of frames per call.

function stream_memory (data: bytes, output_format: miniaudio.SampleFormat = <SampleFormat.SIGNED16: 2>, nchannels: int = 2, sample_rate: int = 44100, frames_to_read: int = 1024, dither: miniaudio.DitherMode = <DitherMode.NONE: 0>) -> Generator[array.array, int, NoneType]

Convenience generator function to decode and stream any supported audio file in memory as chunks of raw PCM samples in the chosen format. If you send() a number into the generator rather than just using next() on it, you'll get that given number of frames, instead of the default configured amount. This is particularly useful to plug this stream into an audio device callback that wants a variable number of frames per call.

function stream_raw_pcm_memory (pcmdata: array.array | memoryview | bytes, nchannels: int, sample_width: int, frames_to_read: int = 4096) -> Generator[bytes | array.array, int, NoneType]

Convenience generator function to stream raw pcm audio data from memory. Usually you don't need to use this as the library provides many other streaming options that work on much smaller, encoded, audio data. However, in the odd case that you only have already decoded raw pcm data you can use this generator as a stream source. The data can be provided in array type or bytes, memoryview or even a numpy array. Be sure to also specify the correct number of channels that the audio data has, and the sample with in bytes.

function stream_with_callbacks (sample_stream: Generator[bytes | array.array, int, NoneType], progress_callback: Callable[[int], NoneType] | None = None, frame_process_method: Callable[[bytes | array.array], bytes | array.array] | None = None, end_callback: Callable | None = None) -> Generator[bytes | array.array, int, NoneType]

Convenience generator function to add callback and processing functionality to another stream. You can specify : > A callback function that gets called during play and takes an int for the number of frames played. > A function that can be used to process raw data frames before they are yielded back (takes an array.array or bytes, returns an array.array or bytes) *Note: if the processing method is slow it will result in audio glitchiness > A callback function that gets called when the stream ends playing.

function vorbis_get_file_info (filename: str) -> miniaudio.SoundFileInfo

Fetch some information about the audio file (vorbis format).

function vorbis_get_info (data: bytes) -> miniaudio.SoundFileInfo

Fetch some information about the audio data (vorbis format).

function vorbis_read (data: bytes) -> miniaudio.DecodedSoundFile

Reads and decodes the whole vorbis audio data. Resulting sample format is 16 bits signed integer.

function vorbis_read_file (filename: str) -> miniaudio.DecodedSoundFile

Reads and decodes the whole vorbis audio file. Resulting sample format is 16 bits signed integer.

function vorbis_stream_file (filename: str, seek_frame: int = 0) -> Generator[array.array, NoneType, NoneType]

Streams the ogg vorbis audio file as interleaved 16 bit signed integer sample arrays segments. This uses a variable unconfigurable chunk size and cannot be used as a generic miniaudio decoder input stream. Consider using stream_file() instead.

function wav_get_file_info (filename: str) -> miniaudio.SoundFileInfo

Fetch some information about the audio file (wav format).

function wav_get_info (data: bytes) -> miniaudio.SoundFileInfo

Fetch some information about the audio data (wav format).

function wav_read_f32 (data: bytes) -> miniaudio.DecodedSoundFile

Reads and decodes the whole wav audio data. Resulting sample format is 32 bits float.

function wav_read_file_f32 (filename: str) -> miniaudio.DecodedSoundFile

Reads and decodes the whole wav audio file. Resulting sample format is 32 bits float.

function wav_read_file_s16 (filename: str) -> miniaudio.DecodedSoundFile

Reads and decodes the whole wav audio file. Resulting sample format is 16 bits signed integer.

function wav_read_file_s32 (filename: str) -> miniaudio.DecodedSoundFile

Reads and decodes the whole wav audio file. Resulting sample format is 32 bits signed integer.

function wav_read_s16 (data: bytes) -> miniaudio.DecodedSoundFile

Reads and decodes the whole wav audio data. Resulting sample format is 16 bits signed integer.

function wav_read_s32 (data: bytes) -> miniaudio.DecodedSoundFile

Reads and decodes the whole wav audio data. Resulting sample format is 32 bits signed integer.

function wav_stream_file (filename: str, frames_to_read: int = 1024, seek_frame: int = 0) -> Generator[array.array, NoneType, NoneType]

Streams the WAV audio file as interleaved 16 bit signed integer sample arrays segments. This uses a fixed chunk size and cannot be used as a generic miniaudio decoder input stream. Consider using stream_file() instead.

function wav_write_file (filename: str, sound: miniaudio.DecodedSoundFile)

Writes the pcm sound to a WAV file

function width_from_format (sampleformat: miniaudio.SampleFormat) -> int

returns the sample width in bytes, of the given sample format.

class CaptureDevice

CaptureDevice (self, input_format: miniaudio.SampleFormat = <SampleFormat.SIGNED16: 2>, nchannels: int = 2, sample_rate: int = 44100, buffersize_msec: int = 200, device_id: _cffi_backend._CDataBase | None = None, callback_periods: int = 0, backends: List[miniaudio.Backend] | None = None, thread_prio: miniaudio.ThreadPriority = <ThreadPriority.HIGHEST: 0>, app_name: str = '')

An audio device provided by miniaudio, for audio capture (recording).

method close (self)

Halt playback or capture and close down the device. If you use the device as a context manager, it will be closed automatically.

method start (self, callback_generator: Generator[NoneType, bytes | array.array, NoneType])

Start the audio device: capture (recording) begins. The recorded audio data is sent to the given callback generator as raw bytes. (it should already be started before)

method stop (self)

Halt playback or capture.

class DecodeError

DecodeError (self, /, *args, **kwargs)

When something went wrong during decoding an audio file.

class DecodedSoundFile

DecodedSoundFile (self, name: str, nchannels: int, sample_rate: int, sample_format: miniaudio.SampleFormat, samples: array.array)

Contains various properties and also the PCM frames of a fully decoded audio file.

class Devices

Devices (self, backends: List[miniaudio.Backend] | None = None)

Query the audio playback and record devices that miniaudio provides

method get_captures (self) -> List[Dict[str, Any]]

Get a list of capture devices and some details about them

method get_playbacks (self) -> List[Dict[str, Any]]

Get a list of playback devices and some details about them

class DuplexStream

DuplexStream (self, playback_format: miniaudio.SampleFormat = <SampleFormat.SIGNED16: 2>, playback_channels: int = 2, capture_format: miniaudio.SampleFormat = <SampleFormat.SIGNED16: 2>, capture_channels: int = 2, sample_rate: int = 44100, buffersize_msec: int = 200, playback_device_id: _cffi_backend._CDataBase | None = None, capture_device_id: _cffi_backend._CDataBase | None = None, callback_periods: int = 0, backends: List[miniaudio.Backend] | None = None, thread_prio: miniaudio.ThreadPriority = <ThreadPriority.HIGHEST: 0>, app_name: str = '')

Joins a capture device and a playback device.

method close (self)

Halt playback or capture and close down the device. If you use the device as a context manager, it will be closed automatically.

method start (self, callback_generator: Generator[bytes | array.array, bytes | array.array, NoneType])

Start the audio device: playback and capture begin. The audio data for playback is provided by the given callback generator, which is sent the recorded audio data at the same time. (it should already be started before passing it in)

method stop (self)

Halt playback or capture.

class IceCastClient

IceCastClient (self, url: str, update_stream_title: Callable[[ForwardRef('IceCastClient'), str], NoneType] = None, ssl_context: 'ssl.SSLContext' = None)

A simple client for IceCast audio streams as miniaudio streamable source. If the stream has Icy MetaData, the stream_title attribute will be updated with the actual title taken from the metadata. You can also provide a callback to be called when a new stream title is available. The downloading of the data from the internet is done in a background thread and it tries to keep a (small) buffer filled with available data to read. You can optionally provide a custom ssl.SSLContext in the ssl_context parameter, if you need to change the way SSL connections are configured (certificates, checks, etc).

method close (self)

Stop the stream, aborting the background downloading.

method read (self, num_bytes: int) -> bytes

Read a chunk of data from the stream.

method seek (self, offset: int, origin: miniaudio.SeekOrigin) -> bool

Override this if the stream supports seeking. Note: seek support is sometimes not needed if you give the file type to a decoder upfront. You can ignore this method then.

class MiniaudioError

MiniaudioError (self, /, *args, **kwargs)

When a miniaudio specific error occurs.

class PlaybackDevice

PlaybackDevice (self, output_format: miniaudio.SampleFormat = <SampleFormat.SIGNED16: 2>, nchannels: int = 2, sample_rate: int = 44100, buffersize_msec: int = 200, device_id: _cffi_backend._CDataBase | None = None, callback_periods: int = 0, backends: List[miniaudio.Backend] | None = None, thread_prio: miniaudio.ThreadPriority = <ThreadPriority.HIGHEST: 0>, app_name: str = '')

An audio device provided by miniaudio, for audio playback.

method close (self)

Halt playback or capture and close down the device. If you use the device as a context manager, it will be closed automatically.

method start (self, callback_generator: Generator[bytes | array.array, int, NoneType])

Start the audio device: playback begins. The audio data is provided by the given callback generator. The generator gets sent the required number of frames and should yield the sample data as raw bytes, a memoryview, an array.array, or as a numpy array with shape (numframes, numchannels). The generator should already be started before passing it in.

method stop (self)

Halt playback or capture.

class SoundFileInfo

SoundFileInfo (self, name: str, file_format: miniaudio.FileFormat, nchannels: int, sample_rate: int, sample_format: miniaudio.SampleFormat, duration: float, num_frames: int, sub_format: int = None)

Contains various properties of an audio file.

class StreamableSource

StreamableSource (self, /, *args, **kwargs)

Base class for streams of audio data bytes. Can be used as a contextmanager, to properly call close().

method close (self)

Override this to properly close the stream and free resources.

method read (self, num_bytes: int) -> bytes | memoryview

override this to provide data bytes to the consumer of the stream

method seek (self, offset: int, origin: miniaudio.SeekOrigin) -> bool

Override this if the stream supports seeking. Note: seek support is sometimes not needed if you give the file type to a decoder upfront. You can ignore this method then.

class WavFileReadStream

WavFileReadStream (self, pcm_sample_gen: Generator[bytes | array.array, int, NoneType], sample_rate: int, nchannels: int, output_format: miniaudio.SampleFormat, max_frames: int = 0)

An IO stream that reads as a .wav file, and which gets its pcm samples from the provided producer

method close (self)

Close the file

method read (self, amount: int = 9223372036854775807) -> bytes | None

Read up to the given amount of bytes from the file.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

miniaudio-1.70.tar.gz (1.1 MB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

miniaudio-1.70-cp313-cp313-win_amd64.whl (274.2 kB view details)

Uploaded CPython 3.13Windows x86-64

miniaudio-1.70-cp313-cp313-win32.whl (235.1 kB view details)

Uploaded CPython 3.13Windows x86

miniaudio-1.70-cp313-cp313-musllinux_1_2_x86_64.whl (643.5 kB view details)

Uploaded CPython 3.13musllinux: musl 1.2+ x86-64

miniaudio-1.70-cp313-cp313-musllinux_1_2_i686.whl (725.4 kB view details)

Uploaded CPython 3.13musllinux: musl 1.2+ i686

miniaudio-1.70-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (627.2 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ x86-64

miniaudio-1.70-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl (711.6 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ i686

miniaudio-1.70-cp313-cp313-macosx_11_0_arm64.whl (351.5 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

miniaudio-1.70-cp313-cp313-macosx_10_13_x86_64.whl (377.2 kB view details)

Uploaded CPython 3.13macOS 10.13+ x86-64

miniaudio-1.70-cp312-cp312-win_amd64.whl (274.2 kB view details)

Uploaded CPython 3.12Windows x86-64

miniaudio-1.70-cp312-cp312-win32.whl (235.1 kB view details)

Uploaded CPython 3.12Windows x86

miniaudio-1.70-cp312-cp312-musllinux_1_2_x86_64.whl (643.5 kB view details)

Uploaded CPython 3.12musllinux: musl 1.2+ x86-64

miniaudio-1.70-cp312-cp312-musllinux_1_2_i686.whl (725.4 kB view details)

Uploaded CPython 3.12musllinux: musl 1.2+ i686

miniaudio-1.70-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (627.2 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

miniaudio-1.70-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl (711.6 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ i686

miniaudio-1.70-cp312-cp312-macosx_11_0_arm64.whl (351.5 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

miniaudio-1.70-cp312-cp312-macosx_10_13_x86_64.whl (377.2 kB view details)

Uploaded CPython 3.12macOS 10.13+ x86-64

miniaudio-1.70-cp311-cp311-win_amd64.whl (274.2 kB view details)

Uploaded CPython 3.11Windows x86-64

miniaudio-1.70-cp311-cp311-win32.whl (235.0 kB view details)

Uploaded CPython 3.11Windows x86

miniaudio-1.70-cp311-cp311-musllinux_1_2_x86_64.whl (643.4 kB view details)

Uploaded CPython 3.11musllinux: musl 1.2+ x86-64

miniaudio-1.70-cp311-cp311-musllinux_1_2_i686.whl (725.8 kB view details)

Uploaded CPython 3.11musllinux: musl 1.2+ i686

miniaudio-1.70-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (626.5 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

miniaudio-1.70-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl (711.3 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ i686

miniaudio-1.70-cp311-cp311-macosx_11_0_arm64.whl (351.4 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

miniaudio-1.70-cp311-cp311-macosx_10_9_x86_64.whl (367.7 kB view details)

Uploaded CPython 3.11macOS 10.9+ x86-64

miniaudio-1.70-cp310-cp310-win_amd64.whl (274.2 kB view details)

Uploaded CPython 3.10Windows x86-64

miniaudio-1.70-cp310-cp310-win32.whl (235.0 kB view details)

Uploaded CPython 3.10Windows x86

miniaudio-1.70-cp310-cp310-musllinux_1_2_x86_64.whl (643.4 kB view details)

Uploaded CPython 3.10musllinux: musl 1.2+ x86-64

miniaudio-1.70-cp310-cp310-musllinux_1_2_i686.whl (725.8 kB view details)

Uploaded CPython 3.10musllinux: musl 1.2+ i686

miniaudio-1.70-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (626.5 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64

miniaudio-1.70-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl (711.3 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ i686

miniaudio-1.70-cp310-cp310-macosx_11_0_arm64.whl (351.4 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

miniaudio-1.70-cp310-cp310-macosx_10_9_x86_64.whl (367.7 kB view details)

Uploaded CPython 3.10macOS 10.9+ x86-64

File details

Details for the file miniaudio-1.70.tar.gz.

File metadata

  • Download URL: miniaudio-1.70.tar.gz
  • Upload date:
  • Size: 1.1 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for miniaudio-1.70.tar.gz
Algorithm Hash digest
SHA256 f788504ee2b8ad3092f34b13d72875dba50597a3d25d8af3ac2f8573d31d8c31
MD5 a92b98734acd26afc14521e846cfe876
BLAKE2b-256 76969129106469f477af798019f0c6064fe42c795ef4a4d8a4637124fb1ea017

See more details on using hashes here.

File details

Details for the file miniaudio-1.70-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: miniaudio-1.70-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 274.2 kB
  • Tags: CPython 3.13, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for miniaudio-1.70-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 2107858d97fad7da021ffd43e109247ee10d6ca31f196f63b2ba2095df9025eb
MD5 f908c17ea54555cdb5ba6363e883760f
BLAKE2b-256 1ab76d88a0f5e50f3d2ccc442e41801d2a625fed09a650e327fafb679f3ff2ed

See more details on using hashes here.

File details

Details for the file miniaudio-1.70-cp313-cp313-win32.whl.

File metadata

  • Download URL: miniaudio-1.70-cp313-cp313-win32.whl
  • Upload date:
  • Size: 235.1 kB
  • Tags: CPython 3.13, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for miniaudio-1.70-cp313-cp313-win32.whl
Algorithm Hash digest
SHA256 387213741b55daca5a2db69a89ae904f7b4bbc0440f81e66352150910ff6e416
MD5 fecaa952383d0f0675db0ec986084994
BLAKE2b-256 b9159aa6ff71dd9d130ee48e00853d873c68e41eb3c40bc2a3cba838dd4cbc00

See more details on using hashes here.

File details

Details for the file miniaudio-1.70-cp313-cp313-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for miniaudio-1.70-cp313-cp313-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 540e1ea433b1f2a2f63bcc4acdc8707ba89299b62db9019913367359a087b597
MD5 4c51430530bc133db7fc35f9f8651f03
BLAKE2b-256 a1ce7610325ac4676da49fb694eca7bb0dcd5a77bcb9d615f3c0da2481b336d5

See more details on using hashes here.

File details

Details for the file miniaudio-1.70-cp313-cp313-musllinux_1_2_i686.whl.

File metadata

File hashes

Hashes for miniaudio-1.70-cp313-cp313-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 50cf3e80675fd34cd00c60efcb503b6254a9d4be8eb4633b401aa1d42f05c165
MD5 5300bf4c66b0a32f4cceb7a19821d5a0
BLAKE2b-256 d6e0d2d9df73bf272d9be184c64d08fa7c53112b0078e5d4fd130807eae63356

See more details on using hashes here.

File details

Details for the file miniaudio-1.70-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for miniaudio-1.70-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 ad0a7ebe9ad4ae987c582f884f87945a21ac3d93131bba01d39797607a5f01cf
MD5 68bbf9d0d3597233d445f8d3024b1f67
BLAKE2b-256 10307a55e5e6d8eea7b658509daa0851e520481857251b73b5c07e7224762983

See more details on using hashes here.

File details

Details for the file miniaudio-1.70-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for miniaudio-1.70-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 4c7b67b4dfbc2478c254fbfb6eca1d3f5f7c6062dd5f63022dfde15099fea20e
MD5 7c644308a5234ac69f7a4ad63dcd8b34
BLAKE2b-256 b0328842979347063267d707eb0ff0621c5107cdcf9eaae8eba8770f4d91a1ca

See more details on using hashes here.

File details

Details for the file miniaudio-1.70-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for miniaudio-1.70-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 e76686f21cf5d1459f64d61ac41a360db3f27e3e89b6bb61274a2ba240d36092
MD5 6850e60dc945589fdd6bbff42738e303
BLAKE2b-256 350010ff94b7aa2957c9fcf6de2be03d1d0e4c1d9398e197fd0b820f388031be

See more details on using hashes here.

File details

Details for the file miniaudio-1.70-cp313-cp313-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for miniaudio-1.70-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 178bf8671c317a6dec5c2ade93394be406bd52f43ac784c5d51e3c71a23e2919
MD5 b85933d33e896e5d86744a88ee3b98a5
BLAKE2b-256 98b0f05684de238618d520a12d1bc59f57078e610475f5704b65d746dc83e12f

See more details on using hashes here.

File details

Details for the file miniaudio-1.70-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: miniaudio-1.70-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 274.2 kB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for miniaudio-1.70-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 e6c66850acafd8bacfa8b39fecc939527783ae2919336bb446c4d7d48e86e612
MD5 03c082f26f7b4290fa9efae668a57c05
BLAKE2b-256 912e9e2874b18ec59d588d4274e759a519fcec174279387507acdddd4b4b2b98

See more details on using hashes here.

File details

Details for the file miniaudio-1.70-cp312-cp312-win32.whl.

File metadata

  • Download URL: miniaudio-1.70-cp312-cp312-win32.whl
  • Upload date:
  • Size: 235.1 kB
  • Tags: CPython 3.12, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for miniaudio-1.70-cp312-cp312-win32.whl
Algorithm Hash digest
SHA256 8adda5de804ececcd1810c9522767f87d2afb951fdd9bce0916fb586457bfc69
MD5 3d00a16bedd66313dbcd92930d8a4623
BLAKE2b-256 98243a522f05bbd687cd7ef8516db0a309bee0b39ca86b23ed9c7c03e8532694

See more details on using hashes here.

File details

Details for the file miniaudio-1.70-cp312-cp312-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for miniaudio-1.70-cp312-cp312-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 3c7116fd74ed2733a4ef6b4f23224fe968872ea89030917f1bcd5eeb7060d0f1
MD5 7b06b06126ebb27fb624a05baff76aaa
BLAKE2b-256 b215cefe111a4b886e17896b809a9d83560902d2edafd2601545bb6587ba128e

See more details on using hashes here.

File details

Details for the file miniaudio-1.70-cp312-cp312-musllinux_1_2_i686.whl.

File metadata

File hashes

Hashes for miniaudio-1.70-cp312-cp312-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 fcda7999e1c170ae59019f7ddf8cfd48aafcdbc8ebd89c25f917b4910e30090e
MD5 7a625e44241dbe00bca0e12c4be718e5
BLAKE2b-256 8f8861c8cdfa0aad5de7a82ac5b571676066e1c80c7dd5c9e4a637b0fd12764f

See more details on using hashes here.

File details

Details for the file miniaudio-1.70-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for miniaudio-1.70-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 ec53c807dce88f457375538e7d81b87cc4366502a581f46b3ee4b50e282b7a2c
MD5 282e5a485fd42b99439ce7e829db2f96
BLAKE2b-256 d692dae213c7f7beff6712cb0d0413c3394515f61ecd7bb47a270cd61953aeec

See more details on using hashes here.

File details

Details for the file miniaudio-1.70-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for miniaudio-1.70-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 4ed1da7e0f903eeea3cecd8c199a39bedf27d782a9de9b81bf1db3d0840c673c
MD5 66aa7ecb8befaf1c7ec17699d95d14a1
BLAKE2b-256 62d7231c1a5c0e512fc3e26153fb3a8138794cc8f898a799ac128dd50b08951a

See more details on using hashes here.

File details

Details for the file miniaudio-1.70-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for miniaudio-1.70-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 5c96244596485a42345b8b7094a1917857d0a4f11a25c254ec9cb8562611093d
MD5 5f4ee8a65dd5fb3243713746ed3cf3a9
BLAKE2b-256 0bb7c7868b0b337946dd755f07454f35b63db97ba4c00b47f9cdb519235cdd2f

See more details on using hashes here.

File details

Details for the file miniaudio-1.70-cp312-cp312-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for miniaudio-1.70-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 bfe53c6d47a13c6ae5612444731f4717a3b293990a6048d9486bf69a83e876ea
MD5 1d4c78f445619df0b7b0d102c0816b5b
BLAKE2b-256 7c8dc01493b78b97c101ce3e28f61466cfdf533da032cf23d7e5aaf029f1bc9f

See more details on using hashes here.

File details

Details for the file miniaudio-1.70-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: miniaudio-1.70-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 274.2 kB
  • Tags: CPython 3.11, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for miniaudio-1.70-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 1a6b58fc456d0384a39233a5889728c4d6b7fa0d105774c620e5666aad2d0bc9
MD5 be12e86fb5e53ac43e378605017b1fa1
BLAKE2b-256 ffed53bf40265a2a4dec1d4e29b45aa744f1b095729610cc7bb18f349aee00bb

See more details on using hashes here.

File details

Details for the file miniaudio-1.70-cp311-cp311-win32.whl.

File metadata

  • Download URL: miniaudio-1.70-cp311-cp311-win32.whl
  • Upload date:
  • Size: 235.0 kB
  • Tags: CPython 3.11, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for miniaudio-1.70-cp311-cp311-win32.whl
Algorithm Hash digest
SHA256 faec5f2d549640e1bffd19f68e6e21449bbe24a0e2eea215c8f8ba78a668d3fc
MD5 aa1b006b5827d7c199cb44b39d1e4ced
BLAKE2b-256 b08b34052c9894d5c00caf897c29cdd6cca5d6143a56d108ec6b68ab999491f6

See more details on using hashes here.

File details

Details for the file miniaudio-1.70-cp311-cp311-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for miniaudio-1.70-cp311-cp311-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 9c385bdcfb203276a662964ddb4b0786790c56a833cdbcab1eece767b99a3476
MD5 a11002bdb42aefdb054e3280331e72a1
BLAKE2b-256 08faf5662af73d50b24d977e506e09f8ed629a81e965e6b3d8dd2c8ba2e113e3

See more details on using hashes here.

File details

Details for the file miniaudio-1.70-cp311-cp311-musllinux_1_2_i686.whl.

File metadata

File hashes

Hashes for miniaudio-1.70-cp311-cp311-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 e39e40562515aea0eafbc21ff9ea7852dd42b8af4f7c65cd218569eaef93add3
MD5 929e67a3c4d21d34b3091b0b306e97a8
BLAKE2b-256 ede22d9279d67976a7adb882ac2718fe7ed530c17229c9d595450f44b026beb3

See more details on using hashes here.

File details

Details for the file miniaudio-1.70-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for miniaudio-1.70-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 770ece1f3a1d6d0c8e0ce17c444b0e46b919e85389d4ef26ea8e354c0de1b840
MD5 19c5fd308cf50e4a932f8d3e45fd83d5
BLAKE2b-256 f4623bf4d21b73a4886a82bd3ec525c135fd2738be025a2674048720f42b1be3

See more details on using hashes here.

File details

Details for the file miniaudio-1.70-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for miniaudio-1.70-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 8eb21a2bd770e575a0ff14b00b2120bfe9e59495f7a61c98c2e1f3942cccaad9
MD5 28116f11b8af14157b5a24b695551d52
BLAKE2b-256 45e3009ad4d9a2f3ef7a73d777bcbba44df238d727a8be95e195f8d4dd2991a1

See more details on using hashes here.

File details

Details for the file miniaudio-1.70-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for miniaudio-1.70-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 588843c600c798e37fbe25b7b9feaa891e6ca0693be89f8d51734b8be441209a
MD5 aaf5073f2959544c618153b4c311dfc3
BLAKE2b-256 16d300ff07363bcd957bc62e466efcaf5d779b5e58f7718bbfd3359e4aec2e70

See more details on using hashes here.

File details

Details for the file miniaudio-1.70-cp311-cp311-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for miniaudio-1.70-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 06401e658d64fff8a4705f2082c093b1f1ce78bf99cbc932e2b8e48ec634cfb9
MD5 3142e91f4dcf8ddc668f77fa28725b5f
BLAKE2b-256 e25a339a181cbb95f9b1616582e7316339fc12a908557303c54c326b904cd050

See more details on using hashes here.

File details

Details for the file miniaudio-1.70-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: miniaudio-1.70-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 274.2 kB
  • Tags: CPython 3.10, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for miniaudio-1.70-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 a71c170e3f9476f707bbb3fce1e8d8c1726be3024c3621685c0d1f29e5510f6b
MD5 4eb5030e1c05313cecb2ec5c51778053
BLAKE2b-256 a2a965fb6c8b18d4f9260c5e1a622954ff184072bf37e7cd7978dca91c153229

See more details on using hashes here.

File details

Details for the file miniaudio-1.70-cp310-cp310-win32.whl.

File metadata

  • Download URL: miniaudio-1.70-cp310-cp310-win32.whl
  • Upload date:
  • Size: 235.0 kB
  • Tags: CPython 3.10, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for miniaudio-1.70-cp310-cp310-win32.whl
Algorithm Hash digest
SHA256 a6db4139f66317cbad89361c82eb82be7984bb827d1c1954950160b020c2b196
MD5 9c61190a1aff6d45a9239ab412b876e4
BLAKE2b-256 dab7b5e433a8895515a2fcf872bab1ee3f3123fdf2c473ad412f5e4959598559

See more details on using hashes here.

File details

Details for the file miniaudio-1.70-cp310-cp310-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for miniaudio-1.70-cp310-cp310-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 07b7a813981aeea441b35324fae20a04872d113ad9731f1fe3fad31f8ef65bab
MD5 917668b42b1ee0fb11f6eb554bda0617
BLAKE2b-256 b4631decb714e51a04f69c02c312c8a5bcd045b79f9ebf7f177c64eb9a65be3f

See more details on using hashes here.

File details

Details for the file miniaudio-1.70-cp310-cp310-musllinux_1_2_i686.whl.

File metadata

File hashes

Hashes for miniaudio-1.70-cp310-cp310-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 e67fa7f34273e651e2f6aa36f06b31bf136e105d9d05332dd2378f89bb0a3f78
MD5 7ca3b3db58a02f32ef5904e59bca5643
BLAKE2b-256 9f42c9f69aafa3034d5c8754596ca55c898773d123a161d5d6665fe9c1335ae4

See more details on using hashes here.

File details

Details for the file miniaudio-1.70-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for miniaudio-1.70-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 e68f0d0e957f716bb7ba2f20623ef032a2c0be5fb1aee4b4f5ecb6710bd2da5c
MD5 f3cad32e944f3b630e102ac6f0266a66
BLAKE2b-256 88a07b9ef53e958bbc91dbe0dff04738e205f814efb383b842c176bc6b7e5eb3

See more details on using hashes here.

File details

Details for the file miniaudio-1.70-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for miniaudio-1.70-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 5c3ef2023a37a1e81e5e9a65abb20934bc910336ebf23d5da3e235b1d8ee488d
MD5 dae0c5f98d55bdcd39df7f7044a981f0
BLAKE2b-256 38c2b2afc8555b78349d1ffc1d9cd25c0e31021edcd1a206d51721f7d2199e1e

See more details on using hashes here.

File details

Details for the file miniaudio-1.70-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for miniaudio-1.70-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 16d86fe5a9fa54b7a15d417c1bf6b1b8ddbfda0bf82acb59fff8bc01336e9bcd
MD5 7723f17840ed92a1a879cb8dd34c6a8b
BLAKE2b-256 9a921cb5aa0751774cd0cabb7c3bfe379e65be107d27c27e9d012830249f24f6

See more details on using hashes here.

File details

Details for the file miniaudio-1.70-cp310-cp310-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for miniaudio-1.70-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 34d0bcda68293c6efceb8ea4c2c1871979193ecd1fbc9fe408fa1a69e1fe40b4
MD5 7188c678a13be00d1a7533425ab34635
BLAKE2b-256 4008cdf480c0bff1ada58d1621fde2d8fd344e6f3373ccdf0344295001aaf1d4

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page