void CDSPControl::closeIO() { setRecordOff(); m_rxReader->close(); m_txReader->close(); m_rxWriter->close(); m_txWriter->close(); if (m_txInControl != NULL) m_txInControl->close(); if (m_keyInControl != NULL) m_keyInControl->close(); if (m_extHandler != NULL) m_extHandler->close(); m_dttsp->close(); m_cwKeyer->close(); m_voiceKeyer->close(); if (m_record != NULL) { m_record->disable(); m_record->close(); } }
LHS_AUDIOIN_ERROR lhs_audioinClose(AUDIOIN_H *phAudioIn) { int doneWaiting = 0; /* Validate the handle */ if ((phAudioIn == NULL) || (*phAudioIn == NULL)) { return LHS_E_AUDIOIN_NULLPOINTER; } /* stop recording audio samples */ setRecordOff(); /* stop reading audio samples */ setCloseOn(); //wait for the thread to stop reading samples. pthread_mutex_lock ( &gAudioMutex ); while (!doneWaiting) { int rc = pthread_cond_wait(&gCloseCalled, &gAudioMutex); switch (rc) { case 0: if (!gCloseCalledSignaled) { // Avoid spurious wakeups continue; } else { gCloseCalledSignaled = 0; doneWaiting = 1; break; } break; default: PLogError ( "Audio In Error pthread_cond_wait\n" ); pthread_mutex_unlock(&gAudioMutex); return ~LHS_AUDIOIN_OK; } } pthread_mutex_unlock(&gAudioMutex); #ifdef FILTER_ON FIR_deconstruct(pFIR); #endif #ifdef AUDIOIN_SUPPORT_CALLBACK /* callback notification */ if (gpCallback != NULL) gpCallback(*phAudioIn, AUDIOIN_MSG_CLOSE, gpCallbackInstance, NULL, NULL); #endif return LHS_AUDIOIN_OK; }
LHS_AUDIOIN_ERROR lhs_audioinStop(AUDIOIN_H hAudioIn) { #ifdef SAVE_RAW_AUDIO fclose ( audio_data ); #endif if (hAudioIn == NULL) { return LHS_E_AUDIOIN_NULLPOINTER; } pthread_mutex_lock ( &gAudioMutex ); /* stop recording (discard samples) */ setRecordOff(); #ifdef AUDIOIN_SUPPORT_CALLBACK /* callback notification */ if (gpCallback != NULL) gpCallback(hAudioIn, AUDIOIN_MSG_STOP, gpCallbackInstance, NULL, NULL); #endif pthread_mutex_unlock ( &gAudioMutex ); return LHS_AUDIOIN_OK; }