⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mddemo.cpp

📁 强大的QT,GTK的学习Demo.包含DSP驱动以及所使用库文件资源。
💻 CPP
📖 第 1 页 / 共 2 页
字号:
 */
bool Dsclass::IsPlayOver()
{
    return !(mddemo->playThread->running());
}

/*
 =======================================================================================================================
 *
 =======================================================================================================================
 */
void Dsclass::startDisplay()
{
    if(!(mddemo->bDisplayOpen))
    {
        mddemo->bDisplayOpen = 1;
        sem_post(&(mddemo->beginSem));
        usleep(USLEEPTIME);
        OutputDebugString("Start the showing port %d\n", mddemo->SignPort);
    }
}

/*
 =======================================================================================================================
 *
 =======================================================================================================================
 */
void Dsclass::stopDisplay()
{
    if(mddemo->bDisplayOpen)
    {
        mddemo->bDisplayOpen = 0;

        if(app)
        {
            app->unlock();
        }

        sem_post(&(mddemo->displaySem));

        pthread_mutex_lock(&(mddemo->DisplayPrepare));
        pthread_mutex_unlock(&(mddemo->DisplayPrepare));

        OutputDebugString("Close the showing port %d\n", mddemo->SignPort);

        if(app)
        {
            app->lock();
        }
    }
}

/*
 =======================================================================================================================
 *
 =======================================================================================================================
 */
void Dsclass::startDisplayThread()
{
    mddemo->bDisplayThreadRun = 1;
    mddemo->displayThread->start();
}

/*
 =======================================================================================================================
 *
 =======================================================================================================================
 */
void Dsclass::stopDisplayThread()
{
    if(mddemo->bDisplayThreadRun)
    {
        stopDisplay();
        mddemo->bDisplayThreadRun = 0;
        sem_post(&(mddemo->beginSem));
        usleep(USLEEPTIME);
    }
}

/*
 =======================================================================================================================
 *
 =======================================================================================================================
 */
void Dsclass::stopPlayOverThread()
{
    sem_post(&(mddemo->FileEndSem));
    usleep(USLEEPTIME);
}

/*
 =======================================================================================================================
 *
 =======================================================================================================================
 */
Dsclass::~Dsclass()
{
    stopDisplayThread();

    if(mddemo->playType == DECODEFILE)
        stopPlayOverThread();

    OutputDebugString("in port %d, before playThread wait\n", mddemo->SignPort);

    mddemo->playThread->wait();
    sem_destroy(&(mddemo->FileEndSem));

    delete mddemo->playThread;

    OutputDebugString("in port %d, before displayThread wait\n", mddemo->SignPort);

    mddemo->displayThread->wait();
    delete mddemo->displayThread;

    pthread_mutex_destroy(&(mddemo->DisplayPrepare));
    sem_destroy(&(mddemo->beginSem));
    sem_destroy(&(mddemo->displaySem));
    sem_destroy(&(mddemo->changesem));

    free(mddemo);
    mddemo = NULL;
}

/*
 =======================================================================================================================
 *
 =======================================================================================================================
 */
void Dsclass::StopPlay()
{
    stopDisplay();

    if(mddemo->playType == DECODEFILE)
    {
        stopPlayOverThread();
        mddemo->playThread->wait();

        /*
         * mddemo->bDisplayOpen = 0;
         */
        mddemo->playType = NODECODE;

        HW_Stop(mddemo->ChannelHandle);
        HW_CloseFile(mddemo->ChannelHandle);
    }
    else if(mddemo->playType == DECODESTREAM)
    {
        /*
         * mddemo->bDisplayOpen = 0;
         */
        mddemo->playType = NODECODE;

        HW_Stop(mddemo->ChannelHandle);
        HW_CloseStream(mddemo->ChannelHandle);

        MP4_ClientStopCapture(mddemo->clienthandle);
        OutputDebugString("&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&\n");
        if(MP4_ClientStop(mddemo->clienthandle) == -1)
            OutputErrorString("<demo_info> Client Stop error 0x%x\n", MP4_ClientGetLastErrorNum());
        OutputDebugString("In function StopPlay, now the ChannelHandle is %d\n",
                          mddemo->ChannelHandle);
        mddemo->clienthandle = -1;
    }
}

/*
 =======================================================================================================================
 *
 =======================================================================================================================
 */
void Dsclass::StartFilePlay()
{
    char*   filename = mddemo->filename;
    OutputDebugString(filename);
    if(HW_OpenFile(mddemo->ChannelHandle, filename) < 0)
    {
        OutputErrorString("<demo_info> the md card open file failed, for 0x%x!\n", GetLastErrorNum());
        return;
    }

    OutputErrorString("<demo_info> the md channel%2d  open file ok!\n", mddemo->ChannelHandle);

    if(HW_Play(mddemo->ChannelHandle) < 0)
        OutputErrorString("<demo_info> play the file failed! error code 0x%x!\n", GetLastErrorNum());
    else
    {
        OutputDebugString("<demo_info> play the file ok,the file end sem is 0x%px!\n",
                          &(mddemo->FileEndSem));
        HW_SetFileEndMsg(mddemo->ChannelHandle, &(mddemo->FileEndSem));
        mddemo->playThread->start();
        sem_post(&(mddemo->beginSem));
    }

    mddemo->datasum = 0;
    mddemo->playType = DECODEFILE;
}

/*
 =======================================================================================================================
 *
 =======================================================================================================================
 */
void Dsclass::StartStreamPlay(char* pFileHead, int nHeadSize)
{
    if(HW_OpenStream(mddemo->ChannelHandle, pFileHead, nHeadSize) < 0)
    {
        OutputErrorString("<demo_info> open stream failed for decode!\n");
        return;
    }

    OutputDebugString("<demo_info> open stream successful for decode!\n");

    if(HW_Play(mddemo->ChannelHandle) < 0)
        OutputErrorString("<demo_info>in decode stream, play failed!\n");

    sem_post(&(mddemo->beginSem));

    mddemo->playType = DECODESTREAM;
}

/*
 =======================================================================================================================
 *
 =======================================================================================================================
 */
void Dsclass::SetdstRect(const int chan)
{
    int SignPort = mddemo->SignPort;

    if(chan < 2)
    {
        OutputErrorString("<demo_info> chan setting error \n");
        return;
    }
    (mddemo->dstRect).x = (SignPort % chan) * (WIN_W / chan);
    (mddemo->dstRect).y = (SignPort / chan) * (WIN_H / chan);
    (mddemo->dstRect).w = WIN_W / chan;
    (mddemo->dstRect).h = WIN_H / chan;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -