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;
}
Exemplo n.º 2
0
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;
                }
            }
        }
    }
}