|
@@ -103,6 +103,7 @@ Error AudioDriverOSX::finishDevice() {
|
|
|
Error AudioDriverOSX::init() {
|
|
|
OSStatus result;
|
|
|
|
|
|
+ mutex = Mutex::create();
|
|
|
active = false;
|
|
|
channels = 2;
|
|
|
|
|
@@ -159,43 +160,30 @@ OSStatus AudioDriverOSX::output_callback(void *inRefCon,
|
|
|
UInt32 inBusNumber, UInt32 inNumberFrames,
|
|
|
AudioBufferList *ioData) {
|
|
|
|
|
|
- AudioBuffer *abuf;
|
|
|
AudioDriverOSX *ad = (AudioDriverOSX *)inRefCon;
|
|
|
|
|
|
- bool mix = true;
|
|
|
-
|
|
|
- if (!ad->active)
|
|
|
- mix = false;
|
|
|
- else if (ad->mutex) {
|
|
|
- mix = ad->mutex->try_lock() == OK;
|
|
|
- };
|
|
|
-
|
|
|
- if (!mix) {
|
|
|
+ if (!ad->active || !ad->try_lock()) {
|
|
|
for (unsigned int i = 0; i < ioData->mNumberBuffers; i++) {
|
|
|
- abuf = &ioData->mBuffers[i];
|
|
|
+ AudioBuffer *abuf = &ioData->mBuffers[i];
|
|
|
zeromem(abuf->mData, abuf->mDataByteSize);
|
|
|
};
|
|
|
return 0;
|
|
|
};
|
|
|
|
|
|
- int frames_left;
|
|
|
-
|
|
|
for (unsigned int i = 0; i < ioData->mNumberBuffers; i++) {
|
|
|
|
|
|
- abuf = &ioData->mBuffers[i];
|
|
|
- frames_left = inNumberFrames;
|
|
|
+ AudioBuffer *abuf = &ioData->mBuffers[i];
|
|
|
+ int frames_left = inNumberFrames;
|
|
|
int16_t *out = (int16_t *)abuf->mData;
|
|
|
|
|
|
while (frames_left) {
|
|
|
|
|
|
int frames = MIN(frames_left, ad->buffer_frames);
|
|
|
- //ad->lock();
|
|
|
ad->audio_server_process(frames, ad->samples_in);
|
|
|
- //ad->unlock();
|
|
|
|
|
|
- for (int i = 0; i < frames * ad->channels; i++) {
|
|
|
+ for (int j = 0; j < frames * ad->channels; j++) {
|
|
|
|
|
|
- out[i] = ad->samples_in[i] >> 16;
|
|
|
+ out[j] = ad->samples_in[j] >> 16;
|
|
|
}
|
|
|
|
|
|
frames_left -= frames;
|
|
@@ -203,8 +191,7 @@ OSStatus AudioDriverOSX::output_callback(void *inRefCon,
|
|
|
};
|
|
|
};
|
|
|
|
|
|
- if (ad->mutex)
|
|
|
- ad->mutex->unlock();
|
|
|
+ ad->unlock();
|
|
|
|
|
|
return 0;
|
|
|
};
|
|
@@ -232,11 +219,18 @@ void AudioDriverOSX::lock() {
|
|
|
if (mutex)
|
|
|
mutex->lock();
|
|
|
};
|
|
|
+
|
|
|
void AudioDriverOSX::unlock() {
|
|
|
if (mutex)
|
|
|
mutex->unlock();
|
|
|
};
|
|
|
|
|
|
+bool AudioDriverOSX::try_lock() {
|
|
|
+ if (mutex)
|
|
|
+ return mutex->try_lock() == OK;
|
|
|
+ return true;
|
|
|
+}
|
|
|
+
|
|
|
void AudioDriverOSX::finish() {
|
|
|
OSStatus result;
|
|
|
|
|
@@ -247,16 +241,23 @@ void AudioDriverOSX::finish() {
|
|
|
ERR_PRINT("AudioObjectRemovePropertyListener failed");
|
|
|
}
|
|
|
|
|
|
- memdelete_arr(samples_in);
|
|
|
+ if (mutex) {
|
|
|
+ memdelete(mutex);
|
|
|
+ mutex = NULL;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (samples_in) {
|
|
|
+ memdelete_arr(samples_in);
|
|
|
+ samples_in = NULL;
|
|
|
+ }
|
|
|
};
|
|
|
|
|
|
AudioDriverOSX::AudioDriverOSX() {
|
|
|
-
|
|
|
- mutex = Mutex::create(); //NULL;
|
|
|
+ mutex = NULL;
|
|
|
+ samples_in = NULL;
|
|
|
};
|
|
|
|
|
|
-AudioDriverOSX::~AudioDriverOSX(){
|
|
|
-
|
|
|
+AudioDriverOSX::~AudioDriverOSX() {
|
|
|
};
|
|
|
|
|
|
#endif
|