| 1 | #include "alutInternal.h" |
|---|
| 2 | |
|---|
| 3 | struct BufferData_struct |
|---|
| 4 | { |
|---|
| 5 | ALvoid *data; |
|---|
| 6 | size_t length; |
|---|
| 7 | ALint numChannels; |
|---|
| 8 | ALint bitsPerSample; |
|---|
| 9 | ALfloat sampleFrequency; |
|---|
| 10 | }; |
|---|
| 11 | |
|---|
| 12 | BufferData * |
|---|
| 13 | _alutBufferDataConstruct (ALvoid *data, size_t length, ALint numChannels, |
|---|
| 14 | ALint bitsPerSample, ALfloat sampleFrequency) |
|---|
| 15 | { |
|---|
| 16 | BufferData *bufferData = (BufferData *) _alutMalloc (sizeof (BufferData)); |
|---|
| 17 | if (bufferData == NULL) |
|---|
| 18 | { |
|---|
| 19 | return NULL; |
|---|
| 20 | } |
|---|
| 21 | |
|---|
| 22 | bufferData->data = data; |
|---|
| 23 | bufferData->length = length; |
|---|
| 24 | bufferData->numChannels = numChannels; |
|---|
| 25 | bufferData->bitsPerSample = bitsPerSample; |
|---|
| 26 | bufferData->sampleFrequency = sampleFrequency; |
|---|
| 27 | |
|---|
| 28 | return bufferData; |
|---|
| 29 | } |
|---|
| 30 | |
|---|
| 31 | ALboolean |
|---|
| 32 | _alutBufferDataDestroy (BufferData *bufferData) |
|---|
| 33 | { |
|---|
| 34 | if (bufferData->data != NULL) |
|---|
| 35 | { |
|---|
| 36 | free (bufferData->data); |
|---|
| 37 | } |
|---|
| 38 | free (bufferData); |
|---|
| 39 | return AL_TRUE; |
|---|
| 40 | } |
|---|
| 41 | |
|---|
| 42 | ALvoid * |
|---|
| 43 | _alutBufferDataGetData (const BufferData *bufferData) |
|---|
| 44 | { |
|---|
| 45 | return bufferData->data; |
|---|
| 46 | } |
|---|
| 47 | |
|---|
| 48 | void |
|---|
| 49 | _alutBufferDataDetachData (BufferData *bufferData) |
|---|
| 50 | { |
|---|
| 51 | bufferData->data = NULL; |
|---|
| 52 | } |
|---|
| 53 | |
|---|
| 54 | size_t |
|---|
| 55 | _alutBufferDataGetLength (const BufferData *bufferData) |
|---|
| 56 | { |
|---|
| 57 | return bufferData->length; |
|---|
| 58 | } |
|---|
| 59 | |
|---|
| 60 | static ALint |
|---|
| 61 | getNumChannels (const BufferData *bufferData) |
|---|
| 62 | { |
|---|
| 63 | return bufferData->numChannels; |
|---|
| 64 | } |
|---|
| 65 | |
|---|
| 66 | static ALint |
|---|
| 67 | getBitsPerSample (const BufferData *bufferData) |
|---|
| 68 | { |
|---|
| 69 | return bufferData->bitsPerSample; |
|---|
| 70 | } |
|---|
| 71 | |
|---|
| 72 | ALfloat |
|---|
| 73 | _alutBufferDataGetSampleFrequency (const BufferData *bufferData) |
|---|
| 74 | { |
|---|
| 75 | return bufferData->sampleFrequency; |
|---|
| 76 | } |
|---|
| 77 | |
|---|
| 78 | /**************************************************************************** |
|---|
| 79 | * The utility functions below do not know the internal BufferData |
|---|
| 80 | * representation. |
|---|
| 81 | ****************************************************************************/ |
|---|
| 82 | |
|---|
| 83 | ALboolean |
|---|
| 84 | _alutGetFormat (const BufferData *bufferData, ALenum *format) |
|---|
| 85 | { |
|---|
| 86 | if (!_alutFormatConstruct |
|---|
| 87 | (getNumChannels (bufferData), getBitsPerSample (bufferData), format)) |
|---|
| 88 | { |
|---|
| 89 | _alutSetError (ALUT_ERROR_UNSUPPORTED_FILE_SUBTYPE); |
|---|
| 90 | return AL_FALSE; |
|---|
| 91 | } |
|---|
| 92 | return AL_TRUE; |
|---|
| 93 | } |
|---|
| 94 | |
|---|
| 95 | static ALuint |
|---|
| 96 | generateBuffer (void) |
|---|
| 97 | { |
|---|
| 98 | ALuint buffer; |
|---|
| 99 | alGenBuffers (1, &buffer); |
|---|
| 100 | if (alGetError () != AL_NO_ERROR) |
|---|
| 101 | { |
|---|
| 102 | _alutSetError (ALUT_ERROR_GEN_BUFFERS); |
|---|
| 103 | return AL_NONE; |
|---|
| 104 | } |
|---|
| 105 | return buffer; |
|---|
| 106 | } |
|---|
| 107 | |
|---|
| 108 | static ALboolean |
|---|
| 109 | passBufferData (BufferData *bufferData, ALuint bid) |
|---|
| 110 | { |
|---|
| 111 | ALenum format; |
|---|
| 112 | size_t size; |
|---|
| 113 | ALfloat frequency; |
|---|
| 114 | if (!_alutGetFormat (bufferData, &format)) |
|---|
| 115 | { |
|---|
| 116 | return AL_FALSE; |
|---|
| 117 | } |
|---|
| 118 | /* GCC is a bit picky about casting function calls, so we do it in two |
|---|
| 119 | steps... */ |
|---|
| 120 | size = _alutBufferDataGetLength (bufferData); |
|---|
| 121 | frequency = _alutBufferDataGetSampleFrequency (bufferData); |
|---|
| 122 | alBufferData (bid, format, _alutBufferDataGetData (bufferData), |
|---|
| 123 | (ALsizei) size, (ALsizei) frequency); |
|---|
| 124 | if (alGetError () != AL_NO_ERROR) |
|---|
| 125 | { |
|---|
| 126 | _alutSetError (ALUT_ERROR_BUFFER_DATA); |
|---|
| 127 | return AL_FALSE; |
|---|
| 128 | } |
|---|
| 129 | return AL_TRUE; |
|---|
| 130 | } |
|---|
| 131 | |
|---|
| 132 | ALuint |
|---|
| 133 | _alutPassBufferData (BufferData *bufferData) |
|---|
| 134 | { |
|---|
| 135 | ALuint buffer = generateBuffer (); |
|---|
| 136 | if (buffer == AL_NONE) |
|---|
| 137 | { |
|---|
| 138 | return AL_NONE; |
|---|
| 139 | } |
|---|
| 140 | |
|---|
| 141 | if (!passBufferData (bufferData, buffer)) |
|---|
| 142 | { |
|---|
| 143 | return AL_NONE; |
|---|
| 144 | } |
|---|
| 145 | |
|---|
| 146 | return buffer; |
|---|
| 147 | } |
|---|