/* mpg123clr: MPEG Audio Decoder library Common Language Runtime version. copyright 2009 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-2008 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 01-Oct-09 Technical cleanup - subst nullptr for NULL (mb) 1.10.0.0 30-Nov-09 Add test for null base (sb) - in addition to null string test (mb) (required if v2 referenced prior to file scan) */ #include "StdAfx.h" #include "id3v2.h" mpg123clr::id3::mpg123id3v2::mpg123id3v2(void) { } mpg123clr::id3::mpg123id3v2::mpg123id3v2(mpg123_id3v2* sb) { this->sb = sb; } // Destructor mpg123clr::id3::mpg123id3v2::~mpg123id3v2(void) { // clean up code to release managed resources // ... // call Finalizer to clean up unmanaged resources this->!mpg123id3v2(); } // Finalizer mpg123clr::id3::mpg123id3v2::!mpg123id3v2(void) { // we do not create the underlying structure, so shouldn't dispose it either... } String^ mpg123clr::id3::mpg123id3v2::title::get() { // updated: more efficient "union style" mpg123str mpg123str^ str = (sb == nullptr || sb->title == nullptr) ? gcnew mpg123str("") : gcnew mpg123str(sb->title); // Deprecated remnant - uses "overlayed style" mpg123str - note inefficient PtrToStrucure... // mpg123str^% str = gcnew mpg123str; // Marshal::PtrToStructure((IntPtr)sb->title, str); return str->Text; } String^ mpg123clr::id3::mpg123id3v2::artist::get() { mpg123str^ str = (sb == nullptr || sb->artist == nullptr) ? gcnew mpg123str("") : gcnew mpg123str(sb->artist); return str->Text; } String^ mpg123clr::id3::mpg123id3v2::album::get() { mpg123str^ str = (sb == nullptr || sb->album == nullptr) ? gcnew mpg123str("") : gcnew mpg123str(sb->album); return str->Text; } String^ mpg123clr::id3::mpg123id3v2::comment::get() { mpg123str^ str = (sb == nullptr || sb->comment == nullptr) ? gcnew mpg123str("") : gcnew mpg123str(sb->comment); return str->Text; } String^ mpg123clr::id3::mpg123id3v2::year::get() { mpg123str^ str = (sb == nullptr || sb->year == nullptr) ? gcnew mpg123str("") : gcnew mpg123str(sb->year); return str->Text; } String^ mpg123clr::id3::mpg123id3v2::genre::get() { mpg123str^ str = (sb == nullptr || sb->genre == nullptr) ? gcnew mpg123str("") : gcnew mpg123str(sb->genre); return str->Text; } int mpg123clr::id3::mpg123id3v2::version::get() { return sb->version; } array^ mpg123clr::id3::mpg123id3v2::MakeTextList(mpg123_text* ptr, size_t count) { // WARN 4267 - clr limited to 32bit-length-size arrays!! array^ ary = gcnew array((int)count); for (int ii = 0; ii < ary->Length; ii++) { // Remnant - for explicit layout // mpg123text^% txt = gcnew mpg123text; // Marshal::PtrToStructure((IntPtr)ptr++, txt); // New code - for "handle style" structure mpg123text^% txt = gcnew mpg123text(ptr++); ary[ii] = txt; } return ary; } array^ mpg123clr::id3::mpg123id3v2::Comments::get() { return MakeTextList(sb->comment_list, sb->comments); } array^ mpg123clr::id3::mpg123id3v2::Texts::get() { return MakeTextList(sb->text, sb->texts); } array^ mpg123clr::id3::mpg123id3v2::Extras::get() { return MakeTextList(sb->extra, sb->extras); }