eARCONTROLLER_ERROR ARCONTROLLER_Stream_Start (ARCONTROLLER_Stream_t *streamController, ARNETWORK_Manager_t *networkManager)
{
    // -- Start to read the stream --

    eARCONTROLLER_ERROR error = ARCONTROLLER_OK;
    
    // Check parameters
    if (streamController == NULL)
    {
        error = ARCONTROLLER_ERROR_BAD_PARAMETER;
    }
    // No Else: the checking parameters sets error to ARNETWORK_ERROR_BAD_PARAMETER and stop the processing

    if ((error == ARCONTROLLER_OK) && (!streamController->isRunning))
    {
        streamController->isRunning = 1;
        
        if (ARCONTROLLER_Stream2_IsInitilized(streamController->stream2Controller))
        {
            error = ARCONTROLLER_Stream2_Start (streamController->stream2Controller);
        }
        else
        {
            error = ARCONTROLLER_Stream1_Start (streamController->stream1Controller, networkManager);
        }
        
        if (error != ARCONTROLLER_OK)
        {
            ARCONTROLLER_Stream_Stop (streamController);
        }
    }
    
    return error;
}
void ARCONTROLLER_Network_Delete (ARCONTROLLER_Network_t **networkController)
{
    // -- Delete the Network Controller --

    if (networkController != NULL)
    {
        if ((*networkController) != NULL)
        {
            (*networkController)->state = ARCONTROLLER_NETWORK_STATE_STOPPED;
            
            ARSAL_Mutex_Destroy (&((*networkController)->mutex));
                        
            // Check if the device has video
            if ((*networkController)->hasVideo)
            {
                ARCONTROLLER_Stream_Stop ((*networkController)->videoController);
            }
            //NO else ; device has not video
            
            ARCONTROLLER_Network_StopReaderThreads (*networkController); //TODO read error !!!!!!!!!!
            
            ARCONTROLLER_Network_StopNetworkThreads (*networkController); //TODO  read error  !!!!!!!!!!
            
            ARNETWORK_Manager_Delete(&((*networkController)->networkManager));
            
            ARDISCOVERY_Device_DeleteARNetworkAL ((*networkController)->discoveryDevice, &((*networkController)->networkALManager)); //TODO  read error  !!!!!!!!!!
            
            ARDISCOVERY_Device_Delete (&((*networkController)->discoveryDevice));
            
            free (*networkController);
            (*networkController) = NULL;
        }
    }
}
eARCONTROLLER_ERROR ARCONTROLLER_Network_StopVideoStream (ARCONTROLLER_Network_t *networkController)
{
    // -- Stop Video stream --
    
    eARCONTROLLER_ERROR error = ARCONTROLLER_OK;
    int locked = 0;
    
    // Check parameters
    if (networkController == NULL)
    {
        error = ARCONTROLLER_ERROR_BAD_PARAMETER;
    }
    // No Else: the checking parameters sets error to ARNETWORK_ERROR_BAD_PARAMETER and stop the processing
    
    if (error == ARCONTROLLER_OK)
    {
        if (ARSAL_Mutex_Lock (&(networkController->mutex)) != 0)
        {
            error = ARCONTROLLER_ERROR_MUTEX;
        }
        else
        {
            locked = 1;
        }
    }
    
    if (error == ARCONTROLLER_OK)
    {
        // Check if the device has video
        if (networkController->hasVideo)
        {
            error = ARCONTROLLER_Stream_Stop (networkController->videoController);
        }
        //NO else ; device has not video
    }
    // No else: skipped by an error
    
    if (locked)
    {
        ARSAL_Mutex_Unlock (&(networkController->mutex));
    }
    
    return error;
}
void ARCONTROLLER_Stream_Delete (ARCONTROLLER_Stream_t **streamController)
{
    // -- Delete the Stream Controller --

    if (streamController != NULL)
    {
        if ((*streamController) != NULL)
        {
            ARCONTROLLER_Stream_Stop (*streamController);

            //Delete stream 1
            ARCONTROLLER_Stream1_Delete (&((*streamController)->stream1Controller));
            
            //Delete stream 2
            ARCONTROLLER_Stream2_Delete (&((*streamController)->stream2Controller));
            
            free (*streamController);
            (*streamController) = NULL;
        }
    }
}