mirror of
https://github.com/thinkonmay/sunshine-sdk.git
synced 2026-01-09 14:11:51 +00:00
allocate and obtain shared memory
This commit is contained in:
parent
9af6e42949
commit
43cc8acf12
@ -87,9 +87,35 @@ deinit_shared_memory() {
|
||||
shared_memory_object::remove(random.c_str());
|
||||
}
|
||||
|
||||
EXPORTS(SharedMemory*)
|
||||
obtain_shared_memory(char* rand){
|
||||
std::vector<std::string> strings;
|
||||
|
||||
std::istringstream f(rand);
|
||||
std::string s;
|
||||
while (getline(f, s, ';')) {
|
||||
strings.push_back(s);
|
||||
}
|
||||
|
||||
if(strings.size() != 2)
|
||||
return NULL;
|
||||
|
||||
std::stringstream h;
|
||||
std::stringstream k;
|
||||
long long handle; h << strings.at(1); h >> handle;
|
||||
std::string key; k << strings.at(0); k >> key;
|
||||
|
||||
//Open managed segment
|
||||
static managed_shared_memory segment(open_only, key.c_str());
|
||||
|
||||
//Get buffer local address from handle
|
||||
SharedMemory* memory = (SharedMemory*)segment.get_address_from_handle(handle);
|
||||
|
||||
return memory;
|
||||
}
|
||||
|
||||
EXPORTS(SharedMemory*)
|
||||
allocate_shared_memory(char* rand,long long* handle) {
|
||||
allocate_shared_memory(char* rand) {
|
||||
//Allocate a portion of the segment (raw memory)
|
||||
std::size_t free_memory = segment.get_free_memory();
|
||||
SharedMemory* memory = (SharedMemory*)segment.allocate(sizeof(SharedMemory));
|
||||
@ -102,9 +128,10 @@ allocate_shared_memory(char* rand,long long* handle) {
|
||||
//An handle from the base address can identify any byte of the shared
|
||||
//memory segment even if it is mapped in different base addresses
|
||||
managed_shared_memory::handle_t hnd = segment.get_handle_from_address((void*)memory);
|
||||
*handle = hnd;
|
||||
|
||||
memcpy(rand,random.c_str(),random.size());
|
||||
std::stringstream s; s << random << ";" << hnd;
|
||||
std::string c; s >> c;
|
||||
memcpy(rand,c.c_str(),c.size());
|
||||
return memory;
|
||||
}
|
||||
|
||||
|
||||
@ -61,7 +61,8 @@ typedef struct {
|
||||
}SharedMemory;
|
||||
|
||||
|
||||
EXPORT(SharedMemory*) allocate_shared_memory(char* rand,long long* handle) ;
|
||||
EXPORT(SharedMemory*) allocate_shared_memory(char* rand) ;
|
||||
EXPORT(SharedMemory*) obtain_shared_memory(char* rand) ;
|
||||
EXPORT(void) lock_shared_memory(SharedMemory* memory);
|
||||
EXPORT(void) unlock_shared_memory(SharedMemory* memory);
|
||||
EXPORT(void) free_shared_memory(SharedMemory* buffer);
|
||||
|
||||
34
parent.go
34
parent.go
@ -122,7 +122,7 @@ func copyAndCapture(r io.Reader) {
|
||||
}
|
||||
}
|
||||
|
||||
func Start() {
|
||||
func main() {
|
||||
mod, err := syscall.LoadDLL("libparent.dll")
|
||||
if err != nil {
|
||||
panic(err)
|
||||
@ -133,6 +133,10 @@ func Start() {
|
||||
}
|
||||
defer deinit.Call()
|
||||
|
||||
obtain, err := mod.FindProc("obtain_shared_memory")
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
proc, err := mod.FindProc("allocate_shared_memory")
|
||||
if err != nil {
|
||||
panic(err)
|
||||
@ -147,18 +151,24 @@ func Start() {
|
||||
}
|
||||
|
||||
buffer := make([]byte, 128)
|
||||
handle := C.longlong(0)
|
||||
ptr, _, err := proc.Call(
|
||||
_, _, err = proc.Call(
|
||||
uintptr(unsafe.Pointer(&buffer[0])),
|
||||
uintptr(unsafe.Pointer(&handle)))
|
||||
)
|
||||
if !errors.Is(err, windows.ERROR_SUCCESS) {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
memory := (*C.SharedMemory)(unsafe.Pointer(ptr))
|
||||
pointer,_,err := obtain.Call(
|
||||
uintptr(unsafe.Pointer(&buffer[0])),
|
||||
)
|
||||
if !errors.Is(err, windows.ERROR_SUCCESS) {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
memory := (*C.SharedMemory)(unsafe.Pointer(pointer))
|
||||
handle_video := func() {
|
||||
lock.Call(ptr)
|
||||
defer unlock.Call(ptr)
|
||||
lock.Call(pointer)
|
||||
defer unlock.Call(pointer)
|
||||
|
||||
block := memory.video[memory.video_order[0]]
|
||||
fmt.Printf("video buffer %d\n", block.size)
|
||||
@ -171,8 +181,8 @@ func Start() {
|
||||
}
|
||||
|
||||
handle_audio := func() {
|
||||
lock.Call(ptr)
|
||||
defer unlock.Call(ptr)
|
||||
lock.Call(pointer)
|
||||
defer unlock.Call(pointer)
|
||||
|
||||
block := memory.audio[memory.audio_order[0]]
|
||||
fmt.Printf("audio buffer %d\n", block.size)
|
||||
@ -197,9 +207,9 @@ func Start() {
|
||||
}
|
||||
}()
|
||||
|
||||
arg1 := fmt.Sprintf("%d", handle)
|
||||
arg2 := byteSliceToString(buffer)
|
||||
cmd := exec.Command("E:\\thinkmay\\worker\\sunshine\\sunshine.exe", arg1, arg2)
|
||||
cmd := exec.Command("E:\\thinkmay\\worker\\sunshine\\build\\sunshine.exe",
|
||||
byteSliceToString(buffer),
|
||||
)
|
||||
|
||||
stdoutIn, _ := cmd.StdoutPipe()
|
||||
stderrIn, _ := cmd.StderrPipe()
|
||||
|
||||
@ -1,7 +0,0 @@
|
||||
package main
|
||||
|
||||
import "testing"
|
||||
|
||||
func TestStart(t *testing.T) {
|
||||
Start()
|
||||
}
|
||||
@ -9,6 +9,7 @@
|
||||
#include <iostream>
|
||||
|
||||
#include <boost/interprocess/sync/scoped_lock.hpp>
|
||||
#include <boost/interprocess/managed_shared_memory.hpp>
|
||||
|
||||
using namespace boost::interprocess;
|
||||
using namespace std::literals;
|
||||
@ -16,17 +17,31 @@ using namespace std::literals;
|
||||
|
||||
|
||||
|
||||
void
|
||||
init_shared_memory(SharedMemory* memory){
|
||||
for (int i = 0; i < QUEUE_SIZE; i++) {
|
||||
memory->audio_order[i] = -1;
|
||||
memory->video_order[i] = -1;
|
||||
SharedMemory* obtain_shared_memory(char* rand) {
|
||||
std::vector<std::string> strings;
|
||||
|
||||
std::istringstream f(rand);
|
||||
std::string s;
|
||||
while (getline(f, s, ';')) {
|
||||
strings.push_back(s);
|
||||
}
|
||||
|
||||
for (int i = 0; i < EventType::EVENT_TYPE_MAX; i++)
|
||||
memory->events[i].read = 1;
|
||||
}
|
||||
if(strings.size() != 2)
|
||||
return NULL;
|
||||
|
||||
std::stringstream h;
|
||||
std::stringstream k;
|
||||
long long handle; h << strings.at(1); h >> handle;
|
||||
std::string key; k << strings.at(0); k >> key;
|
||||
|
||||
//Open managed segment
|
||||
static managed_shared_memory segment(open_only, key.c_str());
|
||||
|
||||
//Get buffer local address from handle
|
||||
SharedMemory* memory = (SharedMemory*)segment.get_address_from_handle(handle);
|
||||
|
||||
return memory;
|
||||
}
|
||||
|
||||
int queue_size(int* queue) {
|
||||
int i = 0;
|
||||
|
||||
@ -64,8 +64,8 @@ typedef struct {
|
||||
interprocess_mutex lock;
|
||||
}SharedMemory;
|
||||
|
||||
void
|
||||
init_shared_memory(SharedMemory* memory);
|
||||
SharedMemory*
|
||||
obtain_shared_memory(char* key);
|
||||
|
||||
void
|
||||
push_audio_packet(SharedMemory* memory, void* data, int size);
|
||||
|
||||
10
src/main.cpp
10
src/main.cpp
@ -145,16 +145,8 @@ main(int argc, char *argv[]) {
|
||||
BOOST_LOG(error) << "Video failed to find working encoder"sv;
|
||||
}
|
||||
|
||||
managed_shared_memory::handle_t handle = 0;
|
||||
std::stringstream s; s << argv[1]; s >> handle;
|
||||
|
||||
//Open managed segment
|
||||
managed_shared_memory segment(open_only, argv[2]);
|
||||
|
||||
|
||||
//Get buffer local address from handle
|
||||
SharedMemory* memory = (SharedMemory*)segment.get_address_from_handle(handle);
|
||||
|
||||
SharedMemory* memory = obtain_shared_memory(argv[1]);
|
||||
|
||||
auto video_capture = std::thread{[&](){
|
||||
video::capture(mail::man,video::config_t{
|
||||
|
||||
@ -243,7 +243,7 @@ namespace platf::dxgi {
|
||||
return true;
|
||||
}
|
||||
|
||||
std::string cmd = "tools\\ddprobe.exe";
|
||||
std::string cmd = "ddprobe.exe";
|
||||
|
||||
// We start at 1 because 0 is automatic selection which can be overridden by
|
||||
// the GPU driver control panel options. Since ddprobe.exe can have different
|
||||
|
||||
Loading…
Reference in New Issue
Block a user