1 
2 #ifndef PA_MAC_CORE_BLOCKING_H_
3 #define PA_MAC_CORE_BLOCKING_H_
4 
5 #include "ringbuffer.h"
6 #include "portaudio.h"
7 #include "pa_mac_core_utilities.h"
8 
9 /*
10  * Number of miliseconds to busy wait whil waiting for data in blocking calls.
11  */
12 #define PA_MAC_BLIO_BUSY_WAIT_SLEEP_INTERVAL (5)
13 /*
14  * Define exactly one of these blocking methods
15  * PA_MAC_BLIO_MUTEX is not actively maintained.
16  */
17 #define PA_MAC_BLIO_BUSY_WAIT
18 /*
19 #define PA_MAC_BLIO_MUTEX
20 */
21 
22 typedef struct {
23     RingBuffer inputRingBuffer;
24     RingBuffer outputRingBuffer;
25     PaSampleFormat inputSampleFormat;
26     size_t inputSampleSize;
27     PaSampleFormat outputSampleFormat;
28     size_t outputSampleSize;
29 
30     size_t framesPerBuffer;
31 
32     int inChan;
33     int outChan;
34 
35     //PaStreamCallbackFlags statusFlags;
36     uint32_t statusFlags;
37     PaError errors;
38 
39     /* Here we handle blocking, using condition variables. */
40 #ifdef  PA_MAC_BLIO_MUTEX
41     volatile bool isInputEmpty;
42     pthread_mutex_t inputMutex;
43     pthread_cond_t inputCond;
44 
45     volatile bool isOutputFull;
46     pthread_mutex_t outputMutex;
47     pthread_cond_t outputCond;
48 #endif
49 }
50 PaMacBlio;
51 
52 /*
53  * These functions operate on condition and related variables.
54  */
55 
56 PaError initializeBlioRingBuffers(
57                                        PaMacBlio *blio,
58                                        PaSampleFormat inputSampleFormat,
59                                        PaSampleFormat outputSampleFormat,
60                                        size_t framesPerBuffer,
61                                        long ringBufferSize,
62                                        int inChan,
63                                        int outChan );
64 PaError destroyBlioRingBuffers( PaMacBlio *blio );
65 PaError resetBlioRingBuffers( PaMacBlio *blio );
66 
67 int BlioCallback(
68         const void *input, void *output,
69         unsigned long frameCount,
70         const PaStreamCallbackTimeInfo* timeInfo,
71         PaStreamCallbackFlags statusFlags,
72         void *userData );
73 
74 void waitUntilBlioWriteBufferIsFlushed( PaMacBlio *blio );
75 
76 #endif /*PA_MAC_CORE_BLOCKING_H_*/
77