src/audio/SDL_sysaudio.h
author Sam Lantinga
Mon, 09 Jan 2017 11:58:01 -0800
changeset 10802 6afc9b833867
parent 10765 61312c8c59fe
child 10882 3f210b3522a3
permissions -rw-r--r--
We only need the first few keymaps corresponding to the following constants:
K_NORMTAB, K_SHIFTTAB, K_ALTTAB, K_ALTSHIFTTAB

In the normal case we'll load all the keymaps from the kernel, but this reduces the size of the SDL library for the fallback case when we can't get to the tty.
slouken@0
     1
/*
slouken@5535
     2
  Simple DirectMedia Layer
slouken@10737
     3
  Copyright (C) 1997-2017 Sam Lantinga <slouken@libsdl.org>
slouken@0
     4
slouken@5535
     5
  This software is provided 'as-is', without any express or implied
slouken@5535
     6
  warranty.  In no event will the authors be held liable for any damages
slouken@5535
     7
  arising from the use of this software.
slouken@0
     8
slouken@5535
     9
  Permission is granted to anyone to use this software for any purpose,
slouken@5535
    10
  including commercial applications, and to alter it and redistribute it
slouken@5535
    11
  freely, subject to the following restrictions:
slouken@0
    12
slouken@5535
    13
  1. The origin of this software must not be misrepresented; you must not
slouken@5535
    14
     claim that you wrote the original software. If you use this software
slouken@5535
    15
     in a product, an acknowledgment in the product documentation would be
slouken@5535
    16
     appreciated but is not required.
slouken@5535
    17
  2. Altered source versions must be plainly marked as such, and must not be
slouken@5535
    18
     misrepresented as being the original software.
slouken@5535
    19
  3. This notice may not be removed or altered from any source distribution.
slouken@0
    20
*/
icculus@8093
    21
#include "../SDL_internal.h"
slouken@0
    22
slouken@10638
    23
#ifndef SDL_sysaudio_h_
slouken@10638
    24
#define SDL_sysaudio_h_
slouken@0
    25
slouken@0
    26
#include "SDL_mutex.h"
slouken@0
    27
#include "SDL_thread.h"
icculus@10681
    28
#include "../SDL_dataqueue.h"
icculus@10758
    29
#include "./SDL_audio_c.h"
slouken@0
    30
icculus@10264
    31
/* !!! FIXME: These are wordy and unlocalized... */
icculus@10264
    32
#define DEFAULT_OUTPUT_DEVNAME "System audio output device"
icculus@10264
    33
#define DEFAULT_INPUT_DEVNAME "System audio capture device"
icculus@10264
    34
slouken@0
    35
/* The SDL audio driver */
slouken@0
    36
typedef struct SDL_AudioDevice SDL_AudioDevice;
slouken@7191
    37
#define _THIS   SDL_AudioDevice *_this
slouken@0
    38
icculus@9394
    39
/* Audio targets should call this as devices are added to the system (such as
icculus@9394
    40
   a USB headset being plugged in), and should also be called for
icculus@9394
    41
   for every device found during DetectDevices(). */
icculus@9394
    42
extern void SDL_AddAudioDevice(const int iscapture, const char *name, void *handle);
icculus@9393
    43
icculus@9394
    44
/* Audio targets should call this as devices are removed, so SDL can update
icculus@9394
    45
   its list of available devices. */
icculus@9399
    46
extern void SDL_RemoveAudioDevice(const int iscapture, void *handle);
icculus@9393
    47
icculus@9394
    48
/* Audio targets should call this if an opened audio device is lost while
icculus@9394
    49
   being used. This can happen due to i/o errors, or a device being unplugged,
icculus@9394
    50
   etc. If the device is totally gone, please also call SDL_RemoveAudioDevice()
icculus@9394
    51
   as appropriate so SDL's list of devices is accurate. */
icculus@9394
    52
extern void SDL_OpenedAudioDeviceDisconnected(SDL_AudioDevice *device);
icculus@9393
    53
icculus@9012
    54
/* This is the size of a packet when using SDL_QueueAudio(). We allocate
icculus@9012
    55
   these as necessary and pool them, under the assumption that we'll
icculus@9012
    56
   eventually end up with a handful that keep recycling, meeting whatever
icculus@9012
    57
   the app needs. We keep packing data tightly as more arrives to avoid
icculus@9012
    58
   wasting space, and if we get a giant block of data, we'll split them
icculus@9012
    59
   into multiple packets behind the scenes. My expectation is that most
icculus@9012
    60
   apps will have 2-3 of these in the pool. 8k should cover most needs, but
icculus@9012
    61
   if this is crippling for some embedded system, we can #ifdef this.
icculus@9012
    62
   The system preallocates enough packets for 2 callbacks' worth of data. */
icculus@9012
    63
#define SDL_AUDIOBUFFERQUEUE_PACKETLEN (8 * 1024)
icculus@9012
    64
icculus@2049
    65
typedef struct SDL_AudioDriverImpl
icculus@2049
    66
{
icculus@9394
    67
    void (*DetectDevices) (void);
icculus@9394
    68
    int (*OpenDevice) (_THIS, void *handle, const char *devname, int iscapture);
icculus@2049
    69
    void (*ThreadInit) (_THIS); /* Called by audio thread at start */
icculus@2049
    70
    void (*WaitDevice) (_THIS);
icculus@2049
    71
    void (*PlayDevice) (_THIS);
icculus@9031
    72
    int (*GetPendingBytes) (_THIS);
icculus@2049
    73
    Uint8 *(*GetDeviceBuf) (_THIS);
icculus@10239
    74
    int (*CaptureFromDevice) (_THIS, void *buffer, int buflen);
icculus@10239
    75
    void (*FlushCapture) (_THIS);
icculus@10473
    76
    void (*PrepareToClose) (_THIS);  /**< Called between run and draining wait for playback devices */
icculus@2049
    77
    void (*CloseDevice) (_THIS);
icculus@2049
    78
    void (*LockDevice) (_THIS);
icculus@2049
    79
    void (*UnlockDevice) (_THIS);
icculus@9394
    80
    void (*FreeDeviceHandle) (void *handle);  /**< SDL is done with handle from SDL_AddAudioDevice() */
icculus@2049
    81
    void (*Deinitialize) (void);
icculus@2049
    82
icculus@5590
    83
    /* !!! FIXME: add pause(), so we can optimize instead of mixing silence. */
icculus@5590
    84
icculus@2049
    85
    /* Some flags to push duplicate code into the core and reduce #ifdefs. */
icculus@9391
    86
    /* !!! FIXME: these should be SDL_bool */
icculus@5589
    87
    int ProvidesOwnCallbackThread;
icculus@10471
    88
    int SkipMixerLock;
icculus@5589
    89
    int HasCaptureSupport;
icculus@5589
    90
    int OnlyHasDefaultOutputDevice;
icculus@10258
    91
    int OnlyHasDefaultCaptureDevice;
icculus@9394
    92
    int AllowsArbitraryDeviceNames;
icculus@2049
    93
} SDL_AudioDriverImpl;
icculus@2049
    94
icculus@2049
    95
icculus@9394
    96
typedef struct SDL_AudioDeviceItem
icculus@9394
    97
{
icculus@9394
    98
    void *handle;
icculus@9394
    99
    struct SDL_AudioDeviceItem *next;
icculus@10680
   100
    char name[SDL_VARIABLE_LENGTH_ARRAY];
icculus@9394
   101
} SDL_AudioDeviceItem;
icculus@9394
   102
icculus@9394
   103
icculus@2049
   104
typedef struct SDL_AudioDriver
slouken@1895
   105
{
slouken@1895
   106
    /* * * */
slouken@1895
   107
    /* The name of this audio driver */
slouken@1895
   108
    const char *name;
slouken@0
   109
slouken@1895
   110
    /* * * */
slouken@1895
   111
    /* The description of this audio driver */
slouken@1895
   112
    const char *desc;
slouken@0
   113
icculus@2049
   114
    SDL_AudioDriverImpl impl;
icculus@5593
   115
icculus@9393
   116
    /* A mutex for device detection */
icculus@9394
   117
    SDL_mutex *detectionLock;
icculus@9394
   118
    SDL_bool captureDevicesRemoved;
icculus@9394
   119
    SDL_bool outputDevicesRemoved;
icculus@5593
   120
    int outputDeviceCount;
icculus@5593
   121
    int inputDeviceCount;
icculus@9394
   122
    SDL_AudioDeviceItem *outputDevices;
icculus@9394
   123
    SDL_AudioDeviceItem *inputDevices;
icculus@2049
   124
} SDL_AudioDriver;
icculus@2049
   125
slouken@0
   126
icculus@2049
   127
/* Define the SDL audio driver structure */
icculus@2049
   128
struct SDL_AudioDevice
icculus@2049
   129
{
slouken@1895
   130
    /* * * */
slouken@1895
   131
    /* Data common to all devices */
icculus@9393
   132
    SDL_AudioDeviceID id;
slouken@0
   133
icculus@10757
   134
    /* The device's current audio specification */
slouken@1895
   135
    SDL_AudioSpec spec;
slouken@0
   136
icculus@10757
   137
    /* The callback's expected audio specification (converted vs device's spec). */
icculus@10757
   138
    SDL_AudioSpec callbackspec;
slouken@0
   139
icculus@10757
   140
    /* Stream that converts and resamples. NULL if not needed. */
icculus@10757
   141
    SDL_AudioStream *stream;
slouken@2716
   142
slouken@1895
   143
    /* Current state flags */
icculus@10233
   144
    SDL_atomic_t shutdown; /* true if we are signaling the play thread to end. */
icculus@10238
   145
    SDL_atomic_t enabled;  /* true if device is functioning and connected. */
icculus@10238
   146
    SDL_atomic_t paused;
icculus@10235
   147
    SDL_bool iscapture;
slouken@0
   148
icculus@10765
   149
    /* Scratch buffer used in the bridge between SDL and the user callback. */
icculus@10765
   150
    Uint8 *work_buffer;
slouken@0
   151
icculus@10765
   152
    /* Size, in bytes, of work_buffer. */
icculus@10765
   153
    Uint32 work_buffer_len;
icculus@10757
   154
icculus@9391
   155
    /* A mutex for locking the mixing buffers */
slouken@1895
   156
    SDL_mutex *mixer_lock;
slouken@0
   157
slouken@1895
   158
    /* A thread to feed the audio device */
slouken@1895
   159
    SDL_Thread *thread;
slouken@3578
   160
    SDL_threadID threadid;
slouken@0
   161
icculus@9012
   162
    /* Queued buffers (if app not using callback). */
icculus@10681
   163
    SDL_DataQueue *buffer_queue;
icculus@9012
   164
slouken@1895
   165
    /* * * */
slouken@1895
   166
    /* Data private to this driver */
slouken@1895
   167
    struct SDL_PrivateAudioData *hidden;
slouken@10467
   168
slouken@10467
   169
    void *handle;
slouken@0
   170
};
slouken@0
   171
#undef _THIS
slouken@0
   172
slouken@1895
   173
typedef struct AudioBootStrap
slouken@1895
   174
{
slouken@1895
   175
    const char *name;
slouken@1895
   176
    const char *desc;
slouken@2060
   177
    int (*init) (SDL_AudioDriverImpl * impl);
icculus@5578
   178
    int demand_only;  /* 1==request explicitly, or it won't be available. */
slouken@0
   179
} AudioBootStrap;
slouken@0
   180
slouken@10609
   181
#if SDL_AUDIO_DRIVER_PULSEAUDIO
slouken@10609
   182
extern AudioBootStrap PULSEAUDIO_bootstrap;
slouken@10609
   183
#endif
slouken@10609
   184
#if SDL_AUDIO_DRIVER_ALSA
slouken@10609
   185
extern AudioBootStrap ALSA_bootstrap;
slouken@10609
   186
#endif
slouken@10609
   187
#if SDL_AUDIO_DRIVER_SNDIO
slouken@10609
   188
extern AudioBootStrap SNDIO_bootstrap;
slouken@10609
   189
#endif
slouken@10609
   190
#if SDL_AUDIO_DRIVER_BSD
slouken@10609
   191
extern AudioBootStrap BSD_AUDIO_bootstrap;
slouken@10609
   192
#endif
slouken@10609
   193
#if SDL_AUDIO_DRIVER_OSS
slouken@10609
   194
extern AudioBootStrap DSP_bootstrap;
slouken@10609
   195
#endif
slouken@10609
   196
#if SDL_AUDIO_DRIVER_QSA
slouken@10609
   197
extern AudioBootStrap QSAAUDIO_bootstrap;
slouken@10609
   198
#endif
slouken@10609
   199
#if SDL_AUDIO_DRIVER_SUNAUDIO
slouken@10609
   200
extern AudioBootStrap SUNAUDIO_bootstrap;
slouken@10609
   201
#endif
slouken@10609
   202
#if SDL_AUDIO_DRIVER_ARTS
slouken@10609
   203
extern AudioBootStrap ARTS_bootstrap;
slouken@10609
   204
#endif
slouken@10609
   205
#if SDL_AUDIO_DRIVER_ESD
slouken@10609
   206
extern AudioBootStrap ESD_bootstrap;
slouken@10609
   207
#endif
slouken@10609
   208
#if SDL_AUDIO_DRIVER_NACL
slouken@10609
   209
extern AudioBootStrap NACLAUDIO_bootstrap;
slouken@10609
   210
#endif
slouken@10609
   211
#if SDL_AUDIO_DRIVER_NAS
slouken@10609
   212
extern AudioBootStrap NAS_bootstrap;
slouken@10609
   213
#endif
slouken@10609
   214
#if SDL_AUDIO_DRIVER_XAUDIO2
slouken@10609
   215
extern AudioBootStrap XAUDIO2_bootstrap;
slouken@10609
   216
#endif
slouken@10609
   217
#if SDL_AUDIO_DRIVER_DSOUND
slouken@10609
   218
extern AudioBootStrap DSOUND_bootstrap;
slouken@10609
   219
#endif
slouken@10609
   220
#if SDL_AUDIO_DRIVER_WINMM
slouken@10609
   221
extern AudioBootStrap WINMM_bootstrap;
slouken@10609
   222
#endif
slouken@10609
   223
#if SDL_AUDIO_DRIVER_PAUDIO
slouken@10609
   224
extern AudioBootStrap PAUDIO_bootstrap;
slouken@10609
   225
#endif
slouken@10609
   226
#if SDL_AUDIO_DRIVER_HAIKU
slouken@10609
   227
extern AudioBootStrap HAIKUAUDIO_bootstrap;
slouken@10609
   228
#endif
slouken@10609
   229
#if SDL_AUDIO_DRIVER_COREAUDIO
slouken@10609
   230
extern AudioBootStrap COREAUDIO_bootstrap;
slouken@10609
   231
#endif
slouken@10609
   232
#if SDL_AUDIO_DRIVER_DISK
slouken@10609
   233
extern AudioBootStrap DISKAUDIO_bootstrap;
slouken@10609
   234
#endif
slouken@10609
   235
#if SDL_AUDIO_DRIVER_DUMMY
slouken@10609
   236
extern AudioBootStrap DUMMYAUDIO_bootstrap;
slouken@10609
   237
#endif
slouken@10609
   238
#if SDL_AUDIO_DRIVER_FUSIONSOUND
slouken@10609
   239
extern AudioBootStrap FUSIONSOUND_bootstrap;
slouken@10609
   240
#endif
slouken@10609
   241
#if SDL_AUDIO_DRIVER_ANDROID
slouken@10609
   242
extern AudioBootStrap ANDROIDAUDIO_bootstrap;
slouken@10609
   243
#endif
slouken@10609
   244
#if SDL_AUDIO_DRIVER_PSP
slouken@10609
   245
extern AudioBootStrap PSPAUDIO_bootstrap;
slouken@10609
   246
#endif
slouken@10609
   247
#if SDL_AUDIO_DRIVER_EMSCRIPTEN
slouken@10609
   248
extern AudioBootStrap EMSCRIPTENAUDIO_bootstrap;
slouken@10609
   249
#endif
slouken@10609
   250
slouken@10609
   251
slouken@10609
   252
slouken@10638
   253
#endif /* SDL_sysaudio_h_ */
slouken@0
   254
slouken@1895
   255
/* vi: set ts=4 sw=4 expandtab: */