[sink_wavwrite] check fseek and fwrite return values
[aubio.git] / src / io / utils_apple_audio.c
1 #include "aubio_priv.h"
2
3 #if defined(HAVE_SOURCE_APPLE_AUDIO) || defined(HAVE_SINK_APPLE_AUDIO)
4
5 // CFURLRef, CFURLCreateWithFileSystemPath, ...
6 #include <CoreFoundation/CoreFoundation.h>
7 // ExtAudioFileRef, AudioStreamBasicDescription, AudioBufferList, ...
8 #include <AudioToolbox/AudioToolbox.h>
9
10 int createAubioBufferList(AudioBufferList *bufferList, int channels, int segmentSize);
11 void freeAudioBufferList(AudioBufferList *bufferList);
12 CFURLRef getURLFromPath(const char * path);
13 char_t *getPrintableOSStatusError(char_t *str, OSStatus error);
14
15 int createAudioBufferList(AudioBufferList * bufferList, int channels,
16     int max_source_samples) {
17   bufferList->mNumberBuffers = 1;
18   bufferList->mBuffers[0].mNumberChannels = channels;
19   bufferList->mBuffers[0].mData = AUBIO_ARRAY(smpl_t, max_source_samples);
20   bufferList->mBuffers[0].mDataByteSize = max_source_samples * sizeof(smpl_t);
21   return 0;
22 }
23
24 void freeAudioBufferList(AudioBufferList *bufferList) {
25   UInt32 i = 0;
26   if (!bufferList) return;
27   for (i = 0; i < bufferList->mNumberBuffers; i++) {
28     if (bufferList->mBuffers[i].mData) {
29       AUBIO_FREE(bufferList->mBuffers[i].mData);
30       bufferList->mBuffers[i].mData = NULL;
31     }
32   }
33   bufferList = NULL;
34 }
35
36 CFURLRef createURLFromPath(const char * path) {
37   CFStringRef cfTotalPath = CFStringCreateWithCString (kCFAllocatorDefault,
38       path, kCFStringEncodingUTF8);
39
40   CFURLRef url = CFURLCreateWithFileSystemPath(kCFAllocatorDefault, cfTotalPath,
41       kCFURLPOSIXPathStyle, false);
42   CFRelease(cfTotalPath);
43   return url;
44 }
45
46 char_t *getPrintableOSStatusError(char_t *str, OSStatus error)
47 {
48     // see if it appears to be a 4-char-code
49     *(UInt32 *)(str + 1) = CFSwapInt32HostToBig(error);
50     if (isprint(str[1]) && isprint(str[2]) && isprint(str[3]) && isprint(str[4])) {
51         str[0] = str[5] = '\'';
52         str[6] = '\0';
53     } else
54         // no, format it as an integer
55         sprintf(str, "%d", (int)error);
56     return str;
57 }
58
59 #endif /* defined(HAVE_SOURCE_APPLE_AUDIO) || defined(HAVE_SINK_APPLE_AUDIO) */