//------------------------------------------------------------------------------ int32 CGUIMusicData_openal::DoLoad() { // identify file type by extension CGUIString strExt; size_t pos = m_strPath.find_last_of("."); if( pos != CGUIString::npos ) { strExt = m_strPath.substr(pos); } for ( uint32 i=0; i<strExt.size(); ++i) { strExt[i] = tolower(strExt[i]); } CGUIString strScenePath = CGUISceneManager::Instance()->GetScenePath( m_strSceneName ) + m_strPath; CGUIString strFullPath; GSystem->GenerateFullPath( strScenePath, strFullPath ); if (strExt == ".ogg") { //load ogg file if( LoadOggFile( strFullPath ) != true) { GUI_THROW( GUI_FORMAT("[CGUISoundData_openal::DoLoad]: failed to load ogg file <%s>!", m_strPath.c_str())); return -1; } } else { GUI_THROW( GUI_FORMAT("[CGUISoundData_openal::DoLoad]: doesn't support the sound type <%s>!", strExt.c_str())); return -1; } //assign the buffer to this source //alSourcei( m_nSourceId, AL_BUFFER, m_nBufferId); //set source position alSource3f( m_nSourceId,AL_POSITION, 0, 0, 0); //set source velocity alSource3f( m_nSourceId,AL_VELOCITY, 0, 0, 0); return 0; }
//------------------------------------------------------------------------------ std::vector<CGUIString> StringToVector(const CGUIString& rString ) { std::vector<CGUIString> aListString; CGUIString::size_type idx = 0; while( idx < rString.size()) { CGUIString::size_type ret = rString.find(",", idx); aListString.push_back(rString.substr(idx, ret)); if( ret == CGUIString::npos ) { break; } else { idx = ret+1; } } return aListString; }
//------------------------------------------------------------------------------ int IGUIStringConv_iconv::Utf8ToWChar( const CGUIString& rSrc, CGUIStringW& rDst ) { if( rSrc.empty()) { rDst.clear(); return 0; } //open iconv iconv_t cd = iconv_open ("UTF-16LE", "UTF-8"); if( cd == (iconv_t)-1 ) { throw CGUIException( "[MultiByteToWideChar]: failed to open iconv, errno is %d", errno); return -1; } //convert size_t buf_size = rSrc.size()+1; size_t inbytesleft = rSrc.size(); size_t outbytesleft = buf_size; char* dst = (char*)(new wchar[buf_size]); char* pOutBuf = NULL; char* pInBuf = (char*)(rSrc.c_str()); bool bError = false; while(inbytesleft > 0) { pOutBuf = dst; outbytesleft = buf_size*sizeof(wchar); size_t retbytes = iconv(cd, &pInBuf, &inbytesleft, &pOutBuf, &outbytesleft); if (dst != pOutBuf) { // wchar is 4byte in mac, but iconv return a "utf-16" buff which is 2byte per code if (sizeof(wchar) == 4) { for (int iChar = 0; iChar < (pOutBuf-dst)/2; iChar++) { unsigned short* pU16Char = (unsigned short*)&dst[2*iChar]; rDst.push_back((wchar)*pU16Char); } } else if (sizeof(wchar) == 2) { rDst.append((wchar*)dst, (pOutBuf-dst)/sizeof(wchar)); } } //check ret if( retbytes == size_t(-1) ) { if( errno == E2BIG ) { continue; } else { bError = true; break; } } else { //success break; } } delete[] dst; if( bError) { switch(errno) { case EILSEQ: throw CGUIException( "[MultiByteToWideChar]: failed to iconv, errno is EILSEQ"); return -1; case EINVAL: throw CGUIException( "[MultiByteToWideChar]: failed to iconv, errno is EINVAL"); return -1; default: throw CGUIException( "[MultiByteToWideChar]: failed to iconv, errno is %d", errno); return -1; } } //close iconv int ret = iconv_close(cd); if( ret == -1 ) { throw CGUIException( "[MultiByteToWideChar]: failed to close iconv, errno is %d", errno); return -1; } return 0; }