PUBLIC EXPORT_SHARED t_cm_error CM_ENGINE_UnbindComponentToCMCore( const t_cm_instance_handle instance, const char *requiredItfClientName, t_nmf_mpc2host_handle *upLayerThis, t_nmf_client_id clientId) { t_interface_require_description itfRequire; t_interface_provide_description itfProvide; t_cm_error error; t_mpc2host_bf_info *bfInfo; t_component_instance* client; OSAL_LOCK_API(); client = cm_lookupComponent(instance); // Sanity check if((error = cm_checkValidUnbinding(client, requiredItfClientName, &itfRequire, &itfProvide)) != CM_OK) goto out; // Check if this is a DSP to Host binding if(itfRequire.client->interfaceReferences[itfRequire.requireIndex][itfRequire.collectionIndex].bfInfoID != BF_DSP2HOST) { error = CM_ILLEGAL_UNBINDING; goto out; } bfInfo = (t_mpc2host_bf_info*)itfRequire.client->interfaceReferences[itfRequire.requireIndex][itfRequire.collectionIndex].bfInfo; // Get client information *upLayerThis = bfInfo->context; // Check if we really need to unbind if(cm_unregisterSingletonBinding(client, &itfRequire, &itfProvide, clientId)) { (void)cm_EEM_ForceWakeup(itfRequire.client->Template->dspId); cm_unbindComponentToCMCore(&itfRequire, bfInfo); cm_EEM_AllowSleep(itfRequire.client->Template->dspId); error = CM_OK; } out: OSAL_UNLOCK_API(); return error; }
void cm_destroyRequireInterface(t_component_instance* component, t_nmf_client_id clientId) { int i, j; /* * Special code for SINGLETON handling */ if(component->Template->classe == SINGLETON) { if(getNumberOfBind(component) > 0) return; } for(i = 0; i < component->Template->requireNumber; i++) { int nb = component->Template->requires[i].collectionSize; for(j = 0; j < nb; j++) { if(component->interfaceReferences[i][j].instance != NULL) { t_interface_reference* itfRef = &component->interfaceReferences[i][j]; t_interface_require_description itfRequire; itfRequire.client = component; itfRequire.requireIndex = i; itfRequire.collectionIndex = j; itfRequire.origName = component->Template->requires[i].name; switch (itfRef->bfInfoID) { case BF_SYNCHRONOUS: /* Error ignored as it is always OK */ cm_unbindInterface(&itfRequire); break; case BF_TRACE: cm_unbindInterfaceTrace(&itfRequire, (t_trace_bf_info*)itfRequire.client->interfaceReferences[itfRequire.requireIndex][itfRequire.collectionIndex].bfInfo); break; case BF_ASYNCHRONOUS: cm_unbindInterfaceAsynchronous(&itfRequire, (t_async_bf_info*)itfRequire.client->interfaceReferences[itfRequire.requireIndex][itfRequire.collectionIndex].bfInfo); break; case BF_DSP2HOST: /* This 'mpc2host handle' is provided by the host at OS Integration level. It must then be handled and released in OS specific part. */ cm_unbindComponentToCMCore(&itfRequire, (t_mpc2host_bf_info*)itfRequire.client->interfaceReferences[itfRequire.requireIndex][itfRequire.collectionIndex].bfInfo); break; case BF_HOST2DSP: /* These bindings are from CM Core to DSP, they are not listed here and must be handled/freed by host at OS Integration level */ break; case BF_DSP2DSP: cm_unbindInterfaceDistributed(&itfRequire, (t_mpc2mpc_bf_info*)itfRequire.client->interfaceReferences[itfRequire.requireIndex][itfRequire.collectionIndex].bfInfo); break; default: break; } } } } }