/* mpg123clr: MPEG Audio Decoder library Common Language Runtime version. copyright 2009-2011 by Malcolm Boczek - free software under the terms of the LGPL 2.1 mpg123clr.dll is a derivative work of libmpg123 - all original mpg123 licensing terms apply. All rights to this work freely assigned to the mpg123 project. */ /* libmpg123: MPEG Audio Decoder library copyright 1995-2011 by the mpg123 project - free software under the terms of the LGPL 2.1 see COPYING and AUTHORS files in distribution or http://mpg123.org */ /* 1.8.1.0 04-Aug-09 Initial release. 1.9.0.0 24-Sep-09 Function names harmonized with libmpg123 (mb) 1.9.0.0 01-Oct-09 Technical cleanup - subst nullptr for NULL (mb) 1.13.0.0 13-Jan-11 release match - added strlen (mb) */ #include "StdAfx.h" #include "string.h" // Constructor for overlaid instance (instanced) mpg123clr::mpg123str::mpg123str(void) { instanced = true; sb = new ::mpg123_string; mpg123_init_string(); } // Constructor for mpg123_string handle instance (referenced) mpg123clr::mpg123str::mpg123str(mpg123_string* sb) { instanced = false; this->sb = sb; } mpg123clr::mpg123str::mpg123str(const char* str) { instanced = true; sb = new ::mpg123_string; mpg123_init_string(); ::mpg123_set_string(sb, str); } // Destructor cleans up all resources mpg123clr::mpg123str::~mpg123str(void) { // clean up code to release managed resources // ... // call Finalizer to clean up unmanaged resources this->!mpg123str(); } // Finalizer cleans up unmanaged resources mpg123clr::mpg123str::!mpg123str(void) { if (instanced && (sb != nullptr)) mpg123_free_string(); } int mpg123clr::mpg123str::mpg123_add_string(String ^ s) { return mpg123_add_substring(s, 0, s->Length); } int mpg123clr::mpg123str::mpg123_add_substring(String ^ s, int from, int count) { // convert CLR string to CLI string using namespace Runtime::InteropServices; const char* chars = (const char*)(Marshal::StringToHGlobalAnsi(s->Substring(from, count))).ToPointer(); // add mpg123_string info int ret = ::mpg123_add_string(sb, chars); // free temporary memory Marshal::FreeHGlobal(IntPtr((void*)chars)); return ret; } int mpg123clr::mpg123str::mpg123_copy_string(mpg123str^ to) { return ::mpg123_copy_string(sb, to->sb); } void mpg123clr::mpg123str::mpg123_free_string() { ::mpg123_free_string(sb); } int mpg123clr::mpg123str::mpg123_grow_string(int newSize) { return ::mpg123_grow_string(sb, newSize); } int mpg123clr::mpg123str::mpg123_resize_string(int newSize) { return ::mpg123_resize_string(sb, newSize); } void mpg123clr::mpg123str::mpg123_init_string() { ::mpg123_init_string(sb); } int mpg123clr::mpg123str::mpg123_set_string(String ^ s) { return mpg123_set_substring(s, 0, s->Length); } int mpg123clr::mpg123str::mpg123_set_substring(String ^ s, int from, int count) { // convert CLR string to CLI string using namespace Runtime::InteropServices; const char* chars = (const char*)(Marshal::StringToHGlobalAnsi(s->Substring(from, count))).ToPointer(); // set mpg123_string info int ret = ::mpg123_set_string(sb, chars); // free temporary memory Marshal::FreeHGlobal(IntPtr((void*)chars)); return ret; } long long mpg123clr::mpg123str::mpg123_strlen(bool utf8) { // TODO: determine use for utf8 vs ansi return ::mpg123_strlen(sb, utf8); } int mpg123clr::mpg123str::Fill::get() { // WARN 4267 - clr limited to 32bit-length-size strings by PtrToStringAnsi return (int)sb->fill; } int mpg123clr::mpg123str::Size::get() { // WARN 4267 - clr limited to 32bit-length-size strings by PtrToStringAnsi return (int)sb->size; } String^ mpg123clr::mpg123str::Text::get() { if (sb->fill == 0) return gcnew String(""); // WARN 4267 - clr limited to 32bit-length-size strings by PtrToStringAnsi return Marshal::PtrToStringAnsi((IntPtr)sb->p, (int)strnlen(sb->p, sb->fill)); } mpg123clr::mpg123str::text_encoding mpg123clr::mpg123str::mpg123_enc_from_id3(unsigned char id3_enc_byte) { return (mpg123clr::mpg123str::text_encoding) ::mpg123_enc_from_id3(id3_enc_byte); } int mpg123clr::mpg123str::mpg123_store_utf8(text_encoding enc, const unsigned char *source, size_t source_size) { return ::mpg123_store_utf8(sb, (mpg123_text_encoding)enc, source, source_size); }