diff options
Diffstat (limited to 'src/opcodes.cpp')
-rw-r--r-- | src/opcodes.cpp | 410 |
1 files changed, 15 insertions, 395 deletions
diff --git a/src/opcodes.cpp b/src/opcodes.cpp index 4e1265c..fa252e2 100644 --- a/src/opcodes.cpp +++ b/src/opcodes.cpp @@ -171,17 +171,6 @@ struct winson : csnd::Plugin<1, 1> { #endif -class MemLocation { -public: - unsigned long start; - unsigned long length; - unsigned long* content; // for mmap test.. - MemLocation(unsigned long start, unsigned long length) { - this->start = start; - this->length = length; - } -}; - class MemParser { private: @@ -190,77 +179,9 @@ private: int pid; bool skip_zero; int buffer_write_position; - std::vector<MemLocation*> locations; - - /* - void iterate_memory(std::function<void (unsigned long, unsigned long)> func) { - procmaps_iterator* maps = pmparser_parse(csound, pid); - procmaps_struct* maps_tmp = NULL; - while ((maps_tmp = pmparser_next(maps)) != NULL) { - if (maps_tmp->is_r && maps_tmp->is_w) { - func((unsigned long) maps_tmp->addr_start, (unsigned long) maps_tmp->length); - } - } - pmparser_free(csound, maps); - } - */ - - bool parsed; - void parse_memory() { - locations.clear(); - procmaps_iterator* maps = pmparser_parse(csound, pid); - procmaps_struct* maps_tmp = NULL; - while ((maps_tmp = pmparser_next(maps)) != NULL) { - if (maps_tmp->is_r && maps_tmp->is_w) { - locations.push_back( - new MemLocation( - (unsigned long) maps_tmp->addr_start, - (unsigned long) maps_tmp->length - ) - ); - std::cout << (unsigned long) maps_tmp->addr_start << "-" << (unsigned long) maps_tmp->length << "\n"; - } - } - pmparser_free(csound, maps); - parsed = true; - } - - // this idea ends up with more mem locations than expected, whytf? vector malloc not right with csound??? - void iterate_memory_step(std::function<bool (long, MYFLT)> func) { - if (!parsed) parse_memory(); - long i; - MYFLT val; int x = 0; - unsigned long* lbuffer = NULL; - std::cout << "sz=" << locations.size() << "\n"; - for (auto &location : locations) { - lbuffer = (unsigned long*) csound->malloc(sizeof(unsigned long) * location->length); - lseek(fd_mem, location->start, SEEK_SET); - read(fd_mem, lbuffer, location->length); - std::cout << (unsigned long) location->start << "-" << (unsigned long) location->length << "\n"; - for (i = 0; i < location->length; i++) { - val = ((MYFLT) lbuffer[i]) / ULONG_MAX; - if (!skip_zero || (skip_zero && val > 0)) { - if (!(func(i, val))) goto complete; - } - - } - - if (lbuffer != NULL) { - csound->free(lbuffer); // causes segfault, WHY??????????? - lbuffer = NULL; - } - - } - complete: - if (lbuffer != NULL) { - csound->free(lbuffer); // causes segfault, WHY??????????? - lbuffer = NULL; - } - - } // func arguments: index and value ; return false to stop iteration, true to continue - void Xiterate_memory_step(std::function<bool (long, MYFLT)> func) { + void iterate_memory_step(std::function<bool (long, MYFLT)> func) { MYFLT val; unsigned long* lbuffer = NULL; procmaps_iterator* maps = pmparser_parse(csound, pid); @@ -303,7 +224,6 @@ public: this->csound = csound; this->skip_zero = skip_zero; this->pid = pid; - parsed = false; total_size = 0; buffer = NULL; buffer_size = 0; @@ -337,7 +257,6 @@ public: return total_size; } - int fill_buffer(MYFLT offset) { if (total_size == 0) { total_size = get_size(); @@ -401,9 +320,8 @@ struct mem2tab : csnd::Plugin<1, 2> { } }; - // read memory from a given pid as audio -// aout memson ipid, koffset, kbuffer_readratio, ibuffersize=441000, iskipzero=0 +// aout memson ipid, koffset, kbuffermultiplier, ibuffersize=441000, iskipzero=0 struct memson : csnd::Plugin<1, 5> { static constexpr char const *otypes = "a"; static constexpr char const *itypes = "ikkjo"; @@ -423,324 +341,29 @@ struct memson : csnd::Plugin<1, 5> { } int aperf() { - for (int i = 0; i < nsmps; i++) { - outargs(0)[i] = mp->buffer[buffer_read_position]; - if (LIKELY(buffer_read_position < mp->buffer_size*inargs[2])) { - buffer_read_position++; - } else { - buffer_read_position = 0; - } - } - if (inargs[1] != last_offset) { - last_offset = inargs[1]; - mp->fill_buffer(last_offset); - } - - return OK; - - } - - -}; - - - - - -typedef struct mmap { - unsigned long start; - unsigned long length; -} _mmap; - - -// read memory from a given pid as audio -// aout memson2 ipid, koffset, kbufsize [, iunsafe] -// where kbufsize is 0 to 1 and koffset is 0 to 1 -struct memson2 : csnd::Plugin<1, 4> { - static constexpr char const *otypes = "a"; - static constexpr char const *itypes = "ikkj"; - int pid; - int buffer_read_position; - int buffer_write_position; - int buffer_size; - int max_buffer_size; - unsigned long total_locations; - MYFLT* buffer; - MYFLT last_buffer_ratio; - MYFLT last_offset; - char* mem_path; - bool unsafe; - - int init() { - max_buffer_size = 441000; - buffer_size = (int) (inargs[2] * max_buffer_size); - last_buffer_ratio = inargs[2]; - last_offset = inargs[1]; - unsafe = (((int)inargs[3]) == 1); - csound->plugin_deinit(this); - pid = (int) inargs[0]; - buffer = (MYFLT*) csound->malloc(sizeof(MYFLT) * max_buffer_size); - mem_path = (char*) csound->malloc(sizeof(char) * 50); - sprintf(mem_path, "/proc/%d/mem", pid); - - buffer_read_position = 0; - buffer_write_position = 0; - total_locations = max_locations(); - refill_buffer(inargs[1], true); - - return OK; - } - - int deinit() { - csound->free(mem_path); - return OK; - } - - unsigned long max_locations() { - procmaps_iterator* maps = pmparser_parse(csound, pid); - int fd_mem = open(mem_path, O_RDWR); - unsigned long len = 0; - procmaps_struct* maps_tmp = NULL; - while ((maps_tmp = pmparser_next(maps)) != NULL) { - if (maps_tmp->is_r && maps_tmp->is_w) { - len += maps_tmp->length; - } + MYFLT buffer_multiplier = inargs[2]; + if (UNLIKELY(buffer_multiplier > 1)) { + buffer_multiplier = 1; + } else if (UNLIKELY(buffer_multiplier < 0)) { + buffer_multiplier = 0; } - pmparser_free(csound, maps); - close(fd_mem); - return len; - } - - int read_mem(int fd_mem, unsigned long start, unsigned long length) { - length = length; // 4; // ?????????????????????????????????????????????????????? - // lbuffer as unsigned char - // https://unix.stackexchange.com/questions/6301/how-do-i-read-from-proc-pid-mem-under-linux - unsigned long* lbuffer = (unsigned long*) csound->malloc(sizeof(unsigned long) * length); - lseek(fd_mem, start, SEEK_SET); - read(fd_mem, lbuffer, length); - - int i; - for (i = 0; i < length; i++) { - //std::cout << "a " << buffer_write_position << "x " << buffer_size << "\n"; - MYFLT val = ((MYFLT)lbuffer[i]) / ULONG_MAX; - buffer[buffer_write_position] = val; - if (buffer_write_position + 1 < buffer_size) { - buffer_write_position++; - } else { - return 1; - } - } - return 0; - } - - - int refill_buffer(MYFLT offset, bool first) { - buffer_write_position = 0; - if (offset > 1) offset = 1; - long offset_position = total_locations * offset; - if (UNLIKELY(offset_position > total_locations - (buffer_size + 1))) { - offset_position = total_locations - (buffer_size + 1); - } - procmaps_iterator* maps = pmparser_parse(csound, pid); - if (maps == NULL) { - //csound->message("cannot open maps"); - return NOTOK; //csound->perf_error("cannot open maps", this->insdshead); - } - - int fd_mem = open(mem_path, O_RDWR); - if (fd_mem == -1) { - //csound->message("cannot open memory"); - return NOTOK; - } - - long position = 0; - unsigned long aof = 0; - procmaps_struct* maps_tmp = NULL; - int res = 0; - while ((maps_tmp = pmparser_next(maps)) != NULL) { - if (maps_tmp->is_r && maps_tmp->is_w) { - if (position >= offset_position) { - aof = position - offset_position; // not quite right, length needs sorting - res = read_mem(fd_mem, ((unsigned long) maps_tmp->addr_start) + aof, (unsigned long) maps_tmp->length); - } - position += maps_tmp->length; - if (res == 1) { - break; - } - } - } - pmparser_free(csound, maps); - close(fd_mem); - return OK; - } - - int aperf() { - if (last_offset != inargs[1] || last_buffer_ratio != inargs[2]) { - last_offset = inargs[1]; - last_buffer_ratio = inargs[2]; - buffer_size = (int) (inargs[2] * max_buffer_size); - refill_buffer(inargs[1], false); - buffer_read_position = 0; - - } for (int i = 0; i < nsmps; i++) { - outargs(0)[i] = buffer[buffer_read_position]; - if (LIKELY(buffer_read_position + 1 < buffer_size)) { + outargs(0)[i] = mp->buffer[buffer_read_position]; + if (LIKELY(buffer_read_position < mp->buffer_size*buffer_multiplier)) { buffer_read_position++; } else { - refill_buffer(inargs[1], false); buffer_read_position = 0; } } - - return OK; - - } - - -}; - - - - - -// read memory from a given pid as audio -struct memson3 : csnd::Plugin<1, 3> { - static constexpr char const *otypes = "a"; - static constexpr char const *itypes = "ikk"; - int pid; - int buffer_read_position; - int buffer_write_position; - int buffer_size; - int max_buffer_size; - unsigned long total_locations; - MYFLT* buffer; - unsigned char* lbuffer; - MYFLT last_buffer_ratio; - MYFLT last_offset; - char* mem_path; - - int init() { - max_buffer_size = 441000; - buffer_size = (int) (inargs[2] * max_buffer_size); - last_buffer_ratio = inargs[2]; - last_offset = inargs[1]; - csound->plugin_deinit(this); - pid = (int) inargs[0]; - buffer = (MYFLT*) csound->malloc(sizeof(MYFLT) * max_buffer_size); - lbuffer = (unsigned char*) csound->malloc(sizeof(unsigned char) * max_buffer_size); - mem_path = (char*) csound->malloc(sizeof(char) * 50); - sprintf(mem_path, "/proc/%d/mem", pid); - - buffer_read_position = 0; - buffer_write_position = 0; - total_locations = max_locations(); - refill_buffer(inargs[1]); - - return OK; - } - - int deinit() { - csound->free(mem_path); - return OK; - } - - unsigned long max_locations() { - procmaps_iterator* maps = pmparser_parse(csound, pid); - int fd_mem = open(mem_path, O_RDWR); - unsigned long len = 0; - procmaps_struct* maps_tmp = NULL; - while ((maps_tmp = pmparser_next(maps)) != NULL) { - if (maps_tmp->is_r && maps_tmp->is_w) { - len += maps_tmp->length; - } - } - pmparser_free(csound, maps); - close(fd_mem); - return len; - } - - int read_mem(int fd_mem, unsigned long start, unsigned long length) { - length = length; // 4; // ?????????????????????????????????????????????????????? - // lbuffer as unsigned char - // https://unix.stackexchange.com/questions/6301/how-do-i-read-from-proc-pid-mem-under-linux - lseek(fd_mem, start, SEEK_SET); - read(fd_mem, lbuffer, length); - - int i; - for (i = 0; i < length; i++) { - //std::cout << "a " << buffer_write_position << "x " << buffer_size << "\n"; - MYFLT val = ((MYFLT)lbuffer[i]) / UCHAR_MAX; - buffer[buffer_write_position] = val; - if (buffer_write_position + 1 < buffer_size) { - buffer_write_position++; - } else { - return 1; - } - } - return 0; - } - - - int refill_buffer(MYFLT offset) { - buffer_write_position = 0; - if (offset > 1) offset = 1; - long offset_position = total_locations * offset; - if (UNLIKELY(offset_position > total_locations - (buffer_size + 1))) { - offset_position = total_locations - (buffer_size + 1); - } - procmaps_iterator* maps = pmparser_parse(csound, pid); - - if (maps == NULL) { - //csound->message("cannot open maps"); - return NOTOK; //csound->perf_error("cannot open maps", this->insdshead); - } - - int fd_mem = open(mem_path, O_RDWR); - if (fd_mem == -1) { - //csound->message("cannot open memory"); - return NOTOK; - } - - long position = 0; - unsigned long aof = 0; - procmaps_struct* maps_tmp = NULL; - int res = 0; - while ((maps_tmp = pmparser_next(maps)) != NULL) { - if (maps_tmp->is_r && maps_tmp->is_w) { - if (position >= offset_position) { - aof = position - offset_position; // not quite right, length needs sorting - res = read_mem(fd_mem, ((unsigned long) maps_tmp->addr_start) + aof, (unsigned long) maps_tmp->length); - } - position += maps_tmp->length; - if (res == 1) { - break; - } - } - } - pmparser_free(csound, maps); - close(fd_mem); - return OK; - } - - int aperf() { - if (last_offset != inargs[1] || last_buffer_ratio != inargs[2]) { + if (inargs[1] != last_offset) { last_offset = inargs[1]; - last_buffer_ratio = inargs[2]; - buffer_size = (int) (inargs[2] * max_buffer_size); - refill_buffer(inargs[1]); - buffer_read_position = 0; - - } - for (int i = 0; i < nsmps; i++) { - outargs(0)[i] = buffer[buffer_read_position]; - if (LIKELY(buffer_read_position + 1 < buffer_size)) { - buffer_read_position++; - } else { - refill_buffer(inargs[1]); - buffer_read_position = 0; + if (UNLIKELY(last_offset > 1)) { + last_offset = 1; + } else if (UNLIKELY(last_offset < 0)) { + last_offset = 0; } + mp->fill_buffer(last_offset); } return OK; @@ -751,13 +374,10 @@ struct memson3 : csnd::Plugin<1, 3> { }; - #include <modload.h> void csnd::on_load(csnd::Csound *csound) { csnd::plugin<memson>(csound, "memson", csnd::thread::ia); - csnd::plugin<memson2>(csound, "memson2", csnd::thread::ia); - csnd::plugin<memson3>(csound, "memson3", csnd::thread::ia); csnd::plugin<memps>(csound, "memps", csnd::thread::i); csnd::plugin<mempsname>(csound, "mempsname", csnd::thread::i); csnd::plugin<mem2tab>(csound, "mem2tab", csnd::thread::i); |