View Issue Details
ID | Project | Category | View Status | Date Submitted | Last Update |
---|---|---|---|---|---|
0001240 | OpenMPT | libopenmpt | public | 2019-07-29 20:23 | 2023-04-10 08:23 |
Reporter | manx | Assigned To | manx | ||
Priority | normal | Severity | minor | Reproducibility | always |
Status | acknowledged | Resolution | open | ||
Product Version | OpenMPT 1.29.00.* (old testing) | ||||
Target Version | OpenMPT 1.32 / libopenmpt 0.8 (goals) | ||||
Summary | 0001240: Modernize C++ API | ||||
Description | We should support more modern language features in the C++ API as appropriate: C++11:
C++14:
C++17:
C++20:
| ||||
Tags | No tags attached. | ||||
Attached Files | libopenmpt-api-cpp17-byte-v1.patch (23,489 bytes)
Index: libopenmpt/dox/changelog.md =================================================================== --- libopenmpt/dox/changelog.md (revision 12200) +++ libopenmpt/dox/changelog.md (working copy) @@ -9,6 +9,18 @@ * [**New**] OggMod compressed FastTracker 2 XM (OXM) modules are now supported. + * [**New**] libopenmpt C++: New API + `openmpt::module::module(std::vector<std::byte> data)`, + `openmpt::module::module(const std::byte * data, std::size_t size)`, + `openmpt::module::module(const std::byte * beg, const std::byte * end)`. + * [**New**] libopenmpt C++: New API + `openmpt::probe_file_header(flags, const std::byte * data, std::size_t size, filesize)`, + `openmpt::probe_file_header(flags, const std::byte * data, std::size_t size)`. + * [**New**] libopenmpt_ext C++: New API + `openmpt::module_ext::module_ext(std::vector<std::byte> data)`, + `openmpt::module_ext::module_ext(const std::byte * data, std::size_t size)`, + `openmpt::module_ext::module_ext(std::vector<std::uint8_t> data)`, + `openmpt::module_ext::module_ext(const std::uint8_t * data, std::size_t size)`. * [**Change**] std::istream based file I/O has been speed up. Index: libopenmpt/libopenmpt.hpp =================================================================== --- libopenmpt/libopenmpt.hpp (revision 12192) +++ libopenmpt/libopenmpt.hpp (working copy) @@ -19,6 +19,7 @@ #include <string> #include <vector> +#include <cstddef> #include <cstdint> /*! @@ -294,6 +295,22 @@ \retval probe_file_header_result_wantmoredata An answer could not be determined with the amount of data provided. \sa openmpt::probe_file_header_get_recommended_size() \sa openmpt::could_open_probability() + \since 0.5.0 +*/ +LIBOPENMPT_CXX_API int probe_file_header( std::uint64_t flags, const std::byte * data, std::size_t size, std::uint64_t filesize ); +//! Probe the provided bytes from the beginning of a file for supported file format headers to find out whether libopenmpt might be able to open it +/*! + \param flags Ored mask of openmpt::probe_file_header_flags_modules and openmpt::probe_file_header_flags_containers, or openmpt::probe_file_header_flags_default. + \param data Beginning of the file data. + \param size Size of the beginning of the file data. + \param filesize Full size of the file data on disk. + \remarks It is recommended to provide openmpt::probe_file_header_get_recommended_size() bytes of data for data and size. If the file is smaller, only provide the filesize amount and set size and filesize to the file's size. + \remarks openmpt::could_open_probability() provides a more elaborate interface that might be required for special use cases. It is recommended to use openmpt::probe_file_header() though, if possible. + \retval probe_file_header_result_success The file will most likely be supported by libopenmpt. + \retval probe_file_header_result_failure The file is not supported by libopenmpt. + \retval probe_file_header_result_wantmoredata An answer could not be determined with the amount of data provided. + \sa openmpt::probe_file_header_get_recommended_size() + \sa openmpt::could_open_probability() \since 0.3.0 */ LIBOPENMPT_CXX_API int probe_file_header( std::uint64_t flags, const std::uint8_t * data, std::size_t size, std::uint64_t filesize ); @@ -311,6 +328,22 @@ \retval probe_file_header_result_wantmoredata An answer could not be determined with the amount of data provided. \sa openmpt::probe_file_header_get_recommended_size() \sa openmpt::could_open_probability() + \since 0.5.0 +*/ +LIBOPENMPT_CXX_API int probe_file_header( std::uint64_t flags, const std::byte * data, std::size_t size ); +//! Probe the provided bytes from the beginning of a file for supported file format headers to find out whether libopenmpt might be able to open it +/*! + \param flags Ored mask of openmpt::probe_file_header_flags_modules and openmpt::probe_file_header_flags_containers, or openmpt::probe_file_header_flags_default. + \param data Beginning of the file data. + \param size Size of the beginning of the file data. + \remarks It is recommended to use the overload of this function that also takes the filesize as parameter if at all possile. libopenmpt can provide more accurate answers if the filesize is known. + \remarks It is recommended to provide openmpt::probe_file_header_get_recommended_size() bytes of data for data and size. If the file is smaller, only provide the filesize amount and set size to the file's size. + \remarks openmpt::could_open_probability() provides a more elaborate interface that might be required for special use cases. It is recommended to use openmpt::probe_file_header() though, if possible. + \retval probe_file_header_result_success The file will most likely be supported by libopenmpt. + \retval probe_file_header_result_failure The file is not supported by libopenmpt. + \retval probe_file_header_result_wantmoredata An answer could not be determined with the amount of data provided. + \sa openmpt::probe_file_header_get_recommended_size() + \sa openmpt::could_open_probability() \since 0.3.0 */ LIBOPENMPT_CXX_API int probe_file_header( std::uint64_t flags, const std::uint8_t * data, std::size_t size ); @@ -424,7 +457,39 @@ \throws openmpt::exception Throws an exception derived from openmpt::exception in case the provided file cannot be opened. \remarks The input data can be discarded after an openmpt::module has been constructed successfully. \sa \ref libopenmpt_cpp_fileio + \since 0.5.0 */ + module( const std::vector<std::byte> & data, std::ostream & log = std::clog, const std::map< std::string, std::string > & ctls = detail::initial_ctls_map() ); + /*! + \param beg Begin of data to load the module from. + \param end End of data to load the module from. + \param log Log where any warnings or errors are printed to. The lifetime of the reference has to be as long as the lifetime of the module instance. + \param ctls A map of initial ctl values, see openmpt::module::get_ctls. + \throws openmpt::exception Throws an exception derived from openmpt::exception in case the provided file cannot be opened. + \remarks The input data can be discarded after an openmpt::module has been constructed successfully. + \sa \ref libopenmpt_cpp_fileio + \since 0.5.0 + */ + module( const std::byte * beg, const std::byte * end, std::ostream & log = std::clog, const std::map< std::string, std::string > & ctls = detail::initial_ctls_map() ); + /*! + \param data Data to load the module from. + \param size Amount of data available. + \param log Log where any warnings or errors are printed to. The lifetime of the reference has to be as long as the lifetime of the module instance. + \param ctls A map of initial ctl values, see openmpt::module::get_ctls. + \throws openmpt::exception Throws an exception derived from openmpt::exception in case the provided file cannot be opened. + \remarks The input data can be discarded after an openmpt::module has been constructed successfully. + \sa \ref libopenmpt_cpp_fileio + \since 0.5.0 + */ + module( const std::byte * data, std::size_t size, std::ostream & log = std::clog, const std::map< std::string, std::string > & ctls = detail::initial_ctls_map() ); + /*! + \param data Data to load the module from. + \param log Log where any warnings or errors are printed to. The lifetime of the reference has to be as long as the lifetime of the module instance. + \param ctls A map of initial ctl values, see openmpt::module::get_ctls. + \throws openmpt::exception Throws an exception derived from openmpt::exception in case the provided file cannot be opened. + \remarks The input data can be discarded after an openmpt::module has been constructed successfully. + \sa \ref libopenmpt_cpp_fileio + */ module( const std::vector<std::uint8_t> & data, std::ostream & log = std::clog, const std::map< std::string, std::string > & ctls = detail::initial_ctls_map() ); /*! \param beg Begin of data to load the module from. Index: libopenmpt/libopenmpt_cxx.cpp =================================================================== --- libopenmpt/libopenmpt_cxx.cpp (revision 12192) +++ libopenmpt/libopenmpt_cxx.cpp (working copy) @@ -137,9 +137,15 @@ std::size_t probe_file_header_get_recommended_size() { return openmpt::module_impl::probe_file_header_get_recommended_size(); } +int probe_file_header( std::uint64_t flags, const std::byte * data, std::size_t size, std::uint64_t filesize ) { + return openmpt::module_impl::probe_file_header( flags, data, size, filesize ); +} int probe_file_header( std::uint64_t flags, const std::uint8_t * data, std::size_t size, std::uint64_t filesize ) { return openmpt::module_impl::probe_file_header( flags, data, size, filesize ); } +int probe_file_header( std::uint64_t flags, const std::byte * data, std::size_t size ) { + return openmpt::module_impl::probe_file_header( flags, data, size ); +} int probe_file_header( std::uint64_t flags, const std::uint8_t * data, std::size_t size ) { return openmpt::module_impl::probe_file_header( flags, data, size ); } @@ -177,6 +183,18 @@ impl = new module_impl( stream, openmpt::helper::make_unique<std_ostream_log>( log ), ctls ); } +module::module( const std::vector<std::byte> & data, std::ostream & log, const std::map< std::string, std::string > & ctls ) : impl(0) { + impl = new module_impl( data, openmpt::helper::make_unique<std_ostream_log>( log ), ctls ); +} + +module::module( const std::byte * beg, const std::byte * end, std::ostream & log, const std::map< std::string, std::string > & ctls ) : impl(0) { + impl = new module_impl( beg, end - beg, openmpt::helper::make_unique<std_ostream_log>( log ), ctls ); +} + +module::module( const std::byte * data, std::size_t size, std::ostream & log, const std::map< std::string, std::string > & ctls ) : impl(0) { + impl = new module_impl( data, size, openmpt::helper::make_unique<std_ostream_log>( log ), ctls ); +} + module::module( const std::vector<std::uint8_t> & data, std::ostream & log, const std::map< std::string, std::string > & ctls ) : impl(0) { impl = new module_impl( data, openmpt::helper::make_unique<std_ostream_log>( log ), ctls ); } @@ -396,14 +414,30 @@ ext_impl = new module_ext_impl( stream, openmpt::helper::make_unique<std_ostream_log>( log ), ctls ); set_impl( ext_impl ); } +module_ext::module_ext( const std::vector<std::uint8_t> & data, std::ostream & log, const std::map< std::string, std::string > & ctls ) : ext_impl(0) { + ext_impl = new module_ext_impl( data, openmpt::helper::make_unique<std_ostream_log>( log ), ctls ); + set_impl( ext_impl ); +} module_ext::module_ext( const std::vector<char> & data, std::ostream & log, const std::map< std::string, std::string > & ctls ) : ext_impl(0) { ext_impl = new module_ext_impl( data, openmpt::helper::make_unique<std_ostream_log>( log ), ctls ); set_impl( ext_impl ); } +module_ext::module_ext( const std::vector<std::byte> & data, std::ostream & log, const std::map< std::string, std::string > & ctls ) : ext_impl(0) { + ext_impl = new module_ext_impl( data, openmpt::helper::make_unique<std_ostream_log>( log ), ctls ); + set_impl( ext_impl ); +} +module_ext::module_ext( const std::uint8_t * data, std::size_t size, std::ostream & log, const std::map< std::string, std::string > & ctls ) : ext_impl(0) { + ext_impl = new module_ext_impl( data, size, openmpt::helper::make_unique<std_ostream_log>( log ), ctls ); + set_impl( ext_impl ); +} module_ext::module_ext( const char * data, std::size_t size, std::ostream & log, const std::map< std::string, std::string > & ctls ) : ext_impl(0) { ext_impl = new module_ext_impl( data, size, openmpt::helper::make_unique<std_ostream_log>( log ), ctls ); set_impl( ext_impl ); } +module_ext::module_ext( const std::byte * data, std::size_t size, std::ostream & log, const std::map< std::string, std::string > & ctls ) : ext_impl(0) { + ext_impl = new module_ext_impl( data, size, openmpt::helper::make_unique<std_ostream_log>( log ), ctls ); + set_impl( ext_impl ); +} module_ext::module_ext( const void * data, std::size_t size, std::ostream & log, const std::map< std::string, std::string > & ctls ) : ext_impl(0) { ext_impl = new module_ext_impl( data, size, openmpt::helper::make_unique<std_ostream_log>( log ), ctls ); set_impl( ext_impl ); Index: libopenmpt/libopenmpt_ext.hpp =================================================================== --- libopenmpt/libopenmpt_ext.hpp (revision 12192) +++ libopenmpt/libopenmpt_ext.hpp (working copy) @@ -44,7 +44,11 @@ void operator = ( const module_ext & ); public: module_ext( std::istream & stream, std::ostream & log = std::clog, const std::map< std::string, std::string > & ctls = detail::initial_ctls_map() ); + module_ext( const std::vector<std::byte> & data, std::ostream & log = std::clog, const std::map< std::string, std::string > & ctls = detail::initial_ctls_map() ); + module_ext( const std::vector<std::uint8_t> & data, std::ostream & log = std::clog, const std::map< std::string, std::string > & ctls = detail::initial_ctls_map() ); module_ext( const std::vector<char> & data, std::ostream & log = std::clog, const std::map< std::string, std::string > & ctls = detail::initial_ctls_map() ); + module_ext( const std::byte * data, std::size_t size, std::ostream & log = std::clog, const std::map< std::string, std::string > & ctls = detail::initial_ctls_map() ); + module_ext( const std::uint8_t * data, std::size_t size, std::ostream & log = std::clog, const std::map< std::string, std::string > & ctls = detail::initial_ctls_map() ); module_ext( const char * data, std::size_t size, std::ostream & log = std::clog, const std::map< std::string, std::string > & ctls = detail::initial_ctls_map() ); module_ext( const void * data, std::size_t size, std::ostream & log = std::clog, const std::map< std::string, std::string > & ctls = detail::initial_ctls_map() ); virtual ~module_ext(); Index: libopenmpt/libopenmpt_ext_impl.cpp =================================================================== --- libopenmpt/libopenmpt_ext_impl.cpp (revision 12192) +++ libopenmpt/libopenmpt_ext_impl.cpp (working copy) @@ -28,6 +28,9 @@ module_ext_impl::module_ext_impl( std::istream & stream, std::unique_ptr<log_interface> log, const std::map< std::string, std::string > & ctls ) : module_impl( stream, std::move(log), ctls ) { ctor(); } + module_ext_impl::module_ext_impl( const std::vector<std::byte> & data, std::unique_ptr<log_interface> log, const std::map< std::string, std::string > & ctls ) : module_impl( data, std::move(log), ctls ) { + ctor(); + } module_ext_impl::module_ext_impl( const std::vector<std::uint8_t> & data, std::unique_ptr<log_interface> log, const std::map< std::string, std::string > & ctls ) : module_impl( data, std::move(log), ctls ) { ctor(); } @@ -34,6 +37,9 @@ module_ext_impl::module_ext_impl( const std::vector<char> & data, std::unique_ptr<log_interface> log, const std::map< std::string, std::string > & ctls ) : module_impl( data, std::move(log), ctls ) { ctor(); } + module_ext_impl::module_ext_impl( const std::byte * data, std::size_t size, std::unique_ptr<log_interface> log, const std::map< std::string, std::string > & ctls ) : module_impl( data, size, std::move(log), ctls ) { + ctor(); + } module_ext_impl::module_ext_impl( const std::uint8_t * data, std::size_t size, std::unique_ptr<log_interface> log, const std::map< std::string, std::string > & ctls ) : module_impl( data, size, std::move(log), ctls ) { ctor(); } Index: libopenmpt/libopenmpt_ext_impl.hpp =================================================================== --- libopenmpt/libopenmpt_ext_impl.hpp (revision 12192) +++ libopenmpt/libopenmpt_ext_impl.hpp (working copy) @@ -33,8 +33,10 @@ public: module_ext_impl( callback_stream_wrapper stream, std::unique_ptr<log_interface> log, const std::map< std::string, std::string > & ctls ); module_ext_impl( std::istream & stream, std::unique_ptr<log_interface> log, const std::map< std::string, std::string > & ctls ); + module_ext_impl( const std::vector<std::byte> & data, std::unique_ptr<log_interface> log, const std::map< std::string, std::string > & ctls ); module_ext_impl( const std::vector<std::uint8_t> & data, std::unique_ptr<log_interface> log, const std::map< std::string, std::string > & ctls ); module_ext_impl( const std::vector<char> & data, std::unique_ptr<log_interface> log, const std::map< std::string, std::string > & ctls ); + module_ext_impl( const std::byte * data, std::size_t size, std::unique_ptr<log_interface> log, const std::map< std::string, std::string > & ctls ); module_ext_impl( const std::uint8_t * data, std::size_t size, std::unique_ptr<log_interface> log, const std::map< std::string, std::string > & ctls ); module_ext_impl( const char * data, std::size_t size, std::unique_ptr<log_interface> log, const std::map< std::string, std::string > & ctls ); module_ext_impl( const void * data, std::size_t size, std::unique_ptr<log_interface> log, const std::map< std::string, std::string > & ctls ); Index: libopenmpt/libopenmpt_impl.cpp =================================================================== --- libopenmpt/libopenmpt_impl.cpp (revision 12192) +++ libopenmpt/libopenmpt_impl.cpp (working copy) @@ -669,6 +669,24 @@ std::size_t module_impl::probe_file_header_get_recommended_size() { return CSoundFile::ProbeRecommendedSize; } +int module_impl::probe_file_header( std::uint64_t flags, const std::byte * data, std::size_t size, std::uint64_t filesize ) { + int result = 0; + switch ( CSoundFile::Probe( static_cast<CSoundFile::ProbeFlags>( flags ), mpt::span<const std::byte>( data, size ), &filesize ) ) { + case CSoundFile::ProbeSuccess: + result = probe_file_header_result_success; + break; + case CSoundFile::ProbeFailure: + result = probe_file_header_result_failure; + break; + case CSoundFile::ProbeWantMoreData: + result = probe_file_header_result_wantmoredata; + break; + default: + throw exception("internal error"); + break; + } + return result; +} int module_impl::probe_file_header( std::uint64_t flags, const std::uint8_t * data, std::size_t size, std::uint64_t filesize ) { int result = 0; switch ( CSoundFile::Probe( static_cast<CSoundFile::ProbeFlags>( flags ), mpt::span<const std::byte>( mpt::byte_cast<const std::byte*>( data ), size ), &filesize ) ) { @@ -705,6 +723,24 @@ } return result; } +int module_impl::probe_file_header( std::uint64_t flags, const std::byte * data, std::size_t size ) { + int result = 0; + switch ( CSoundFile::Probe( static_cast<CSoundFile::ProbeFlags>( flags ), mpt::span<const std::byte>( data, size ), nullptr ) ) { + case CSoundFile::ProbeSuccess: + result = probe_file_header_result_success; + break; + case CSoundFile::ProbeFailure: + result = probe_file_header_result_failure; + break; + case CSoundFile::ProbeWantMoreData: + result = probe_file_header_result_wantmoredata; + break; + default: + throw exception("internal error"); + break; + } + return result; +} int module_impl::probe_file_header( std::uint64_t flags, const std::uint8_t * data, std::size_t size ) { int result = 0; switch ( CSoundFile::Probe( static_cast<CSoundFile::ProbeFlags>( flags ), mpt::span<const std::byte>( mpt::byte_cast<const std::byte*>( data ), size ), nullptr ) ) { @@ -838,6 +874,11 @@ load( make_FileReader( &stream ), ctls ); apply_libopenmpt_defaults(); } +module_impl::module_impl( const std::vector<std::byte> & data, std::unique_ptr<log_interface> log, const std::map< std::string, std::string > & ctls ) : m_Log(std::move(log)) { + ctor( ctls ); + load( make_FileReader( mpt::as_span( data ) ), ctls ); + apply_libopenmpt_defaults(); +} module_impl::module_impl( const std::vector<std::uint8_t> & data, std::unique_ptr<log_interface> log, const std::map< std::string, std::string > & ctls ) : m_Log(std::move(log)) { ctor( ctls ); load( make_FileReader( mpt::as_span( data ) ), ctls ); @@ -848,6 +889,11 @@ load( make_FileReader( mpt::byte_cast< mpt::span< const std::byte > >( mpt::as_span( data ) ) ), ctls ); apply_libopenmpt_defaults(); } +module_impl::module_impl( const std::byte * data, std::size_t size, std::unique_ptr<log_interface> log, const std::map< std::string, std::string > & ctls ) : m_Log(std::move(log)) { + ctor( ctls ); + load( make_FileReader( mpt::as_span( data, size ) ), ctls ); + apply_libopenmpt_defaults(); +} module_impl::module_impl( const std::uint8_t * data, std::size_t size, std::unique_ptr<log_interface> log, const std::map< std::string, std::string > & ctls ) : m_Log(std::move(log)) { ctor( ctls ); load( make_FileReader( mpt::as_span( data, size ) ), ctls ); Index: libopenmpt/libopenmpt_impl.hpp =================================================================== --- libopenmpt/libopenmpt_impl.hpp (revision 12192) +++ libopenmpt/libopenmpt_impl.hpp (working copy) @@ -135,8 +135,10 @@ static double could_open_probability( callback_stream_wrapper stream, double effort, std::unique_ptr<log_interface> log ); static double could_open_probability( std::istream & stream, double effort, std::unique_ptr<log_interface> log ); static std::size_t probe_file_header_get_recommended_size(); + static int probe_file_header( std::uint64_t flags, const std::byte * data, std::size_t size, std::uint64_t filesize ); static int probe_file_header( std::uint64_t flags, const std::uint8_t * data, std::size_t size, std::uint64_t filesize ); static int probe_file_header( std::uint64_t flags, const void * data, std::size_t size, std::uint64_t filesize ); + static int probe_file_header( std::uint64_t flags, const std::byte * data, std::size_t size ); static int probe_file_header( std::uint64_t flags, const std::uint8_t * data, std::size_t size ); static int probe_file_header( std::uint64_t flags, const void * data, std::size_t size ); static int probe_file_header( std::uint64_t flags, std::istream & stream ); @@ -143,8 +145,10 @@ static int probe_file_header( std::uint64_t flags, callback_stream_wrapper stream ); module_impl( callback_stream_wrapper stream, std::unique_ptr<log_interface> log, const std::map< std::string, std::string > & ctls ); module_impl( std::istream & stream, std::unique_ptr<log_interface> log, const std::map< std::string, std::string > & ctls ); + module_impl( const std::vector<std::byte> & data, std::unique_ptr<log_interface> log, const std::map< std::string, std::string > & ctls ); module_impl( const std::vector<std::uint8_t> & data, std::unique_ptr<log_interface> log, const std::map< std::string, std::string > & ctls ); module_impl( const std::vector<char> & data, std::unique_ptr<log_interface> log, const std::map< std::string, std::string > & ctls ); + module_impl( const std::byte * data, std::size_t size, std::unique_ptr<log_interface> log, const std::map< std::string, std::string > & ctls ); module_impl( const std::uint8_t * data, std::size_t size, std::unique_ptr<log_interface> log, const std::map< std::string, std::string > & ctls ); module_impl( const char * data, std::size_t size, std::unique_ptr<log_interface> log, const std::map< std::string, std::string > & ctls ); module_impl( const void * data, std::size_t size, std::unique_ptr<log_interface> log, const std::map< std::string, std::string > & ctls ); | ||||
Has the bug occurred in previous versions? | |||||
Tested code revision (in case you know it) | |||||
If we want to support C++17 features in the libopenmpt API which I think we should for the next version), we either need to require C++17 also for building libopenmpt, or need to support multiple ABI-incompatible variants of the same libopenmpt version (which would be a nightmare). |
|
libopenmpt-api-cpp17-byte-v1 looks good in general, but I would suggest that we change "Ored mask" to "Or-ed mask" or "Bit mask" in the doxygen comments. It took me a few seconds to parse what the word was supposed to mean. |
|
|
|
Date Modified | Username | Field | Change |
---|---|---|---|
2019-07-29 20:23 | manx | New Issue | |
2019-07-29 20:23 | manx | Status | new => assigned |
2019-07-29 20:23 | manx | Assigned To | => manx |
2019-07-29 20:47 | manx | Relationship added | related to 0001241 |
2019-09-05 13:10 | manx | Relationship added | related to 0001256 |
2019-09-05 13:39 | manx | Note Added: 0004040 | |
2019-10-03 08:32 | manx | Description Updated | |
2019-10-03 08:36 | manx | Description Updated | |
2019-10-14 17:55 | manx | File Added: libopenmpt-api-cpp17-v1.patch | |
2019-10-14 18:23 | manx | File Added: libopenmpt-api-cpp17-v3.patch | |
2019-10-14 18:26 | manx | Description Updated | |
2019-10-14 18:27 | manx | File Deleted: libopenmpt-api-cpp17-v1.patch | |
2019-10-14 18:27 | manx | File Deleted: libopenmpt-api-cpp17-v3.patch | |
2019-10-15 08:29 | manx | File Added: libopenmpt-api-cpp17-byte-v1.patch | |
2019-10-26 15:47 | Saga Musix | Note Added: 0004118 | |
2019-11-04 14:52 | manx | Note Added: 0004139 | |
2019-11-04 14:57 | manx | Description Updated | |
2020-01-05 10:43 | manx | Target Version | OpenMPT 1.29.01.00 / libopenmpt 0.5.0 (upgrade first) => OpenMPT 1.30.01.00 / libopenmpt 0.6.0 (upgrade first) |
2020-06-12 08:00 | manx | Relationship added | related to 0001340 |
2020-06-12 18:02 | manx | Status | assigned => acknowledged |
2020-11-28 19:58 | manx | Target Version | OpenMPT 1.30.01.00 / libopenmpt 0.6.0 (upgrade first) => OpenMPT 1.31.01.00 / libopenmpt 0.7.0 (upgrade first) |
2021-02-14 10:48 | manx | Description Updated | |
2023-04-10 08:23 | manx | Target Version | OpenMPT 1.31.01.00 / libopenmpt 0.7.0 (upgrade first) => OpenMPT 1.32 / libopenmpt 0.8 (goals) |