[14] | 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 | } |
---|