// --------------------------------------------------------- // Update the texture info of a sender // Used for example when a sender's texture changes size // --------------------------------------------------------- bool spoutSenderNames::UpdateSender(const char *sendername, unsigned int width, unsigned int height, HANDLE hSharehandle, DWORD dwFormat) { std::string namestring = sendername; if (m_senders->find(namestring) == m_senders->end()) { // Create or open a shared memory map for this sender - allocate enough for the texture info SpoutSharedMemory *senderInfoMem = new SpoutSharedMemory(); SpoutCreateResult result = senderInfoMem->Create(sendername, sizeof(SharedTextureInfo)); if(result == SPOUT_CREATE_FAILED) { delete senderInfoMem; m_senderNames.Unlock(); return false; } (*m_senders)[namestring] = senderInfoMem; } // Save the info for this sender in the sender shared memory map if(!SetSenderInfo(sendername, width, height, hSharehandle, dwFormat)) { return false; } return true; } // end UpdateSender
void spoutSenderNames::cleanSenderSet() { if(!CreateSenderSet()) { return; } char *pBuf = m_senderNames.Lock(); if (!pBuf) { return; } std::set<std::string> SenderNames; readSenderSetFromBuffer(pBuf, SenderNames, m_MaxSenders); bool changed = false; for (auto itr = SenderNames.begin(); itr != SenderNames.end(); ) { // It's one of ours, so thats fine if (m_senders->find(*itr) != m_senders->end()) { itr++; continue; } SpoutSharedMemory mem; // This isn't found, we clean it up if (!mem.Open((*itr).c_str())) { changed = true; SenderNames.erase(itr++); } else { ++itr; } } if (changed) { writeBufferFromSenderSet(SenderNames, pBuf, m_MaxSenders); } m_senderNames.Unlock(); }
// Return current sharing handle, width and height of a Sender // A receiver checks this all the time so it has to be compact // Does not have to be the info of this instance // so the creation pointer and handle may not be known bool spoutSenderNames::getSharedInfo(const char* sharedMemoryName, SharedTextureInfo* info) { SpoutSharedMemory mem; // Possibly faster because the functon is called all the time if(mem.Open(sharedMemoryName)) { char *pBuf = mem.Lock(); if(pBuf) { memcpy((void *)info, (void *)pBuf, sizeof(SharedTextureInfo) ); mem.Unlock(); return true; } } return false; } // end getSharedInfo
// Return current sharing handle, width and height of a Sender // A receiver checks this all the time so it has to be compact // Does not have to be the info of this instance // so the creation pointer and handle may not be known bool spoutSenderNames::getSharedInfo(const char* sharedMemoryName, SharedTextureInfo* info) { SpoutSharedMemory mem; bool result = mem.Open(sharedMemoryName); if (!result) return false; char *pBuf = mem.Lock(); if(!pBuf) { return false; } memcpy((void *)info, (void *)pBuf, sizeof(SharedTextureInfo) ); mem.Unlock(); return true; } // end getSharedInfo
// 12.06.15 - Added to allow direct modification of a sender's information in shared memory bool spoutSenderNames::setSharedInfo(const char* sharedMemoryName, SharedTextureInfo* info) { SpoutSharedMemory mem; bool result = mem.Open(sharedMemoryName); if (!result) { printf(" memory not found\n"); return false; } char *pBuf = mem.Lock(); if (!pBuf) { printf(" buffer not locked\n"); return false; } memcpy((void *)pBuf, (void *)info, sizeof(SharedTextureInfo) ); mem.Unlock(); return true; } // end getSharedInfo