mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-01-31 03:27:39 +00:00
121 lines
4.3 KiB
C
121 lines
4.3 KiB
C
/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│
|
|
│ vi: set et ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi │
|
|
╞══════════════════════════════════════════════════════════════════════════════╡
|
|
│ Copyright 2024 Justine Alexandra Roberts Tunney │
|
|
│ │
|
|
│ Permission to use, copy, modify, and/or distribute this software for │
|
|
│ any purpose with or without fee is hereby granted, provided that the │
|
|
│ above copyright notice and this permission notice appear in all copies. │
|
|
│ │
|
|
│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │
|
|
│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │
|
|
│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │
|
|
│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │
|
|
│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │
|
|
│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │
|
|
│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │
|
|
│ PERFORMANCE OF THIS SOFTWARE. │
|
|
╚─────────────────────────────────────────────────────────────────────────────*/
|
|
#include "dsp/audio/describe.h"
|
|
#include "dsp/audio/cosmoaudio/cosmoaudio.h"
|
|
#include "libc/intrin/describeflags.h"
|
|
#include "libc/intrin/kprintf.h"
|
|
#include "libc/macros.h"
|
|
|
|
#define append(...) o += ksnprintf(buf + o, n - o, __VA_ARGS__)
|
|
|
|
const char *cosmoaudio_describe_status(char *buf, int n, int status) {
|
|
switch (status) {
|
|
case COSMOAUDIO_SUCCESS:
|
|
return "COSMOAUDIO_SUCCESS";
|
|
case COSMOAUDIO_ERROR:
|
|
return "COSMOAUDIO_ERROR";
|
|
case COSMOAUDIO_EINVAL:
|
|
return "COSMOAUDIO_EINVAL";
|
|
case COSMOAUDIO_ELINK:
|
|
return "COSMOAUDIO_ELINK";
|
|
case COSMOAUDIO_ENOBUF:
|
|
return "COSMOAUDIO_ENOBUF";
|
|
default:
|
|
ksnprintf(buf, n, "%d", status);
|
|
return buf;
|
|
}
|
|
}
|
|
|
|
const char *cosmoaudio_describe_open_options(
|
|
char *buf, int n, const struct CosmoAudioOpenOptions *options) {
|
|
int o = 0;
|
|
char b128[128];
|
|
bool gotsome = false;
|
|
if (!options)
|
|
return "NULL";
|
|
if (kisdangerous(options)) {
|
|
ksnprintf(buf, n, "%p", options);
|
|
return buf;
|
|
}
|
|
append("{");
|
|
|
|
if (options->sampleRate) {
|
|
if (gotsome)
|
|
append(", ");
|
|
append(".sampleRate=%d", options->sampleRate);
|
|
gotsome = true;
|
|
}
|
|
|
|
if (options->channels) {
|
|
if (gotsome)
|
|
append(", ");
|
|
append(".channels=%d", options->channels);
|
|
gotsome = true;
|
|
}
|
|
|
|
if (options->deviceType) {
|
|
if (gotsome)
|
|
append(", ");
|
|
static struct DescribeFlags kDeviceType[] = {
|
|
{kCosmoAudioDeviceTypeDuplex, "Duplex"}, //
|
|
{kCosmoAudioDeviceTypeCapture, "Capture"}, //
|
|
{kCosmoAudioDeviceTypePlayback, "Playback"}, //
|
|
};
|
|
append(".deviceType=%s",
|
|
_DescribeFlags(b128, 128, kDeviceType, ARRAYLEN(kDeviceType),
|
|
"kCosmoAudioDeviceType", options->deviceType));
|
|
gotsome = true;
|
|
}
|
|
|
|
if (options->bufferFrames) {
|
|
if (gotsome)
|
|
append(", ");
|
|
append(".bufferFrames=%d", options->bufferFrames);
|
|
gotsome = true;
|
|
}
|
|
|
|
if (options->debugLog) {
|
|
if (gotsome)
|
|
append(", ");
|
|
append(".debugLog=%d", options->debugLog);
|
|
gotsome = true;
|
|
}
|
|
|
|
if (options->sizeofThis) {
|
|
if (gotsome)
|
|
append(", ");
|
|
append(".sizeofThis=%d", options->sizeofThis);
|
|
gotsome = true;
|
|
}
|
|
|
|
append("}");
|
|
return buf;
|
|
}
|
|
|
|
const char *cosmoaudio_describe_poll_frames(char *buf, int n,
|
|
int *in_out_frames) {
|
|
if (!in_out_frames)
|
|
return "NULL";
|
|
if (kisdangerous(in_out_frames)) {
|
|
ksnprintf(buf, n, "%p", in_out_frames);
|
|
return buf;
|
|
}
|
|
ksnprintf(buf, n, "[%d]", *in_out_frames);
|
|
return buf;
|
|
}
|