百度首页 | 百度空间
 
查看文章
 
接上篇
2008年05月30日 星期五 14:56
bool CDXGraph::SetFullScreen(BOOL inEnabled)
{
       if (mVideoWindow)
       {
              HRESULT hr = mVideoWindow->put_FullScreenMode(inEnabled ? OATRUE : OAFALSE);
              return SUCCEEDED(hr);
       }
       return false;
}
bool CDXGraph::GetFullScreen(void)
{
       if (mVideoWindow)
       {
              long fullScreenMode = OAFALSE;
              mVideoWindow->get_FullScreenMode(&fullScreenMode);
              return (fullScreenMode == OATRUE);
       }
       return false;
}
// IMediaSeeking features
bool CDXGraph::GetCurrentPosition(double * outPosition)
{
       if (mSeeking)
       {
              __int64 position = 0;
              if (SUCCEEDED(mSeeking->GetCurrentPosition(&position)))
              {
                     *outPosition = ((double)position) / 10000000.;
                     return true;
              }
       }
       return false;
}
bool CDXGraph::GetStopPosition(double * outPosition)
{
       if (mSeeking)
       {
              __int64 position = 0;
              if (SUCCEEDED(mSeeking->GetStopPosition(&position)))
              {
                     *outPosition = ((double)position) / 10000000.;
                     return true;
              }
       }
       return false;
}
bool CDXGraph::SetCurrentPosition(double inPosition)
{
       if (mSeeking)
       {
              __int64 one = 10000000;
              __int64 position = (__int64)(one * inPosition);
              HRESULT hr = mSeeking->SetPositions(&position, AM_SEEKING_AbsolutePositioning | AM_SEEKING_SeekToKeyFrame,
                     0, AM_SEEKING_NoPositioning);
              return SUCCEEDED(hr);
       }
       return false;
}
bool CDXGraph::SetStartStopPosition(double inStart, double inStop)
{
       if (mSeeking)
       {
              __int64 one = 10000000;
              __int64 startPos = (__int64)(one * inStart);
              __int64 stopPos = (__int64)(one * inStop);
              HRESULT hr = mSeeking->SetPositions(&startPos, AM_SEEKING_AbsolutePositioning | AM_SEEKING_SeekToKeyFrame,
                     &stopPos, AM_SEEKING_AbsolutePositioning | AM_SEEKING_SeekToKeyFrame);
              return SUCCEEDED(hr);
       }
       return false;
}
bool CDXGraph::GetDuration(double * outDuration)
{
       if (mSeeking)
       {
              __int64 length = 0;
              if (SUCCEEDED(mSeeking->GetDuration(&length)))
              {
                     *outDuration = ((double)length) / 10000000.;
                     return true;
              }
       }
       return false;
}
bool CDXGraph::SetPlaybackRate(double inRate)
{
       if (mSeeking)
       {
              if (SUCCEEDED(mSeeking->SetRate(inRate)))
              {
                     return true;
              }
       }
       return false;
}
// Attention: range from -10000 to 0, and 0 is FULL_VOLUME.
bool CDXGraph::SetAudioVolume(long inVolume)
{
       if (mBasicAudio)
       {
              HRESULT hr = mBasicAudio->put_Volume(inVolume);
              return SUCCEEDED(hr);
       }
       return false;
}
long CDXGraph::GetAudioVolume(void)
{
       long volume = 0;
       if (mBasicAudio)
       {
              mBasicAudio->get_Volume(&volume);
       }
       return volume;
}
// Attention: range from -10000(left) to 10000(right), and 0 is both.
bool CDXGraph::SetAudioBalance(long inBalance)
{
       if (mBasicAudio)
       {
              HRESULT hr = mBasicAudio->put_Balance(inBalance);
              return SUCCEEDED(hr);
       }
       return false;
}
long CDXGraph::GetAudioBalance(void)
{
       long balance = 0;
       if (mBasicAudio)
       {
              mBasicAudio->get_Balance(&balance);
       }
       return balance;
}
bool CDXGraph::RenderFile(const char * inFile)
{
       if (mGraph)
       {
              WCHAR    szFilePath[MAX_PATH];
              MultiByteToWideChar(CP_ACP, 0, inFile, -1, szFilePath, MAX_PATH);
              if (SUCCEEDED(mGraph->RenderFile(szFilePath, NULL)))
              {
                     return true;
              }
       }
       return false;
}
bool CDXGraph::SnapshotBitmap(const char * outFile)
{
       if (mBasicVideo)
       {
              long bitmapSize = 0;
              if (SUCCEEDED(mBasicVideo->GetCurrentImage(&bitmapSize, 0)))
              {
                     bool pass = false;
                     unsigned char * buffer = new unsigned char[bitmapSize];
                     if (SUCCEEDED(mBasicVideo->GetCurrentImage(&bitmapSize, (long *)buffer)))
                     {
                            BITMAPFILEHEADER hdr;
                            LPBITMAPINFOHEADER    lpbi;
                            lpbi = (LPBITMAPINFOHEADER)buffer;
                            int nColors = 1 << lpbi->biBitCount;
                            if (nColors > 256)
                                   nColors = 0;
                            hdr.bfType             = ((WORD) ('M' << 8) | 'B'); //always is "BM"
                            hdr.bfSize              = bitmapSize + sizeof( hdr );
                            hdr.bfReserved1    = 0;
                            hdr.bfReserved2    = 0;
                            hdr.bfOffBits         = (DWORD) (sizeof(BITMAPFILEHEADER) + lpbi->biSize +
                                          nColors * sizeof(RGBQUAD));
                            CFile bitmapFile(outFile, CFile::modeReadWrite | CFile::modeCreate | CFile::typeBinary);
                            bitmapFile.Write(&hdr, sizeof(BITMAPFILEHEADER));
                            bitmapFile.Write(buffer, bitmapSize);
                            bitmapFile.Close();
                            pass = true;
                     }
                     delete [] buffer;
                     return pass;
              }
       }
       return false;
}
//////////////////////// For GraphEdit Dubug purpose /////////////////////////////
void CDXGraph::AddToObjectTable(void)
{
       IMoniker * pMoniker = 0;
    IRunningObjectTable * objectTable = 0;
    if (SUCCEEDED(GetRunningObjectTable(0, &objectTable)))
       {
              WCHAR wsz[256];
              wsprintfW(wsz, L"FilterGraph %08p pid %08x", (DWORD_PTR)mGraph, GetCurrentProcessId());
              HRESULT hr = CreateItemMoniker(L"!", wsz, &pMoniker);
              if (SUCCEEDED(hr))
              {
                     hr = objectTable->Register(0, mGraph, pMoniker, &mObjectTableEntry);
                     pMoniker->Release();
              }
              objectTable->Release();
       }
}
void CDXGraph::RemoveFromObjectTable(void)
{
       IRunningObjectTable * objectTable = 0;
    if (SUCCEEDED(GetRunningObjectTable(0, &objectTable)))
       {
        objectTable->Revoke(mObjectTableEntry);
        objectTable->Release();
              mObjectTableEntry = 0;
    }
}

类别:电子/wince相关(所有资料均来自网络,版权归原作 | 添加到搜藏 | 浏览() | 评论 (0)
 
最近读者:
 
网友评论:
发表评论:
姓 名:
网址或邮箱: (选填)
内 容:
验证码:
 

     

©2008 Baidu