Index: libopenmpt/bindings/freebasic/libopenmpt.bi =================================================================== --- libopenmpt/bindings/freebasic/libopenmpt.bi (revision 21858) +++ libopenmpt/bindings/freebasic/libopenmpt.bi (working copy) @@ -1273,6 +1273,20 @@ '/ Declare Function openmpt_module_get_order_pattern(ByVal module As openmpt_module Ptr, ByVal order As Long) As Long +/'* \brief Get skip ("+++") pattern index + + \param module The module handle to work on. + \return The pattern index that represents skip items in the order list. During playback, this order list item is ignored and playback resumes at the next order list item. +'/ +Declare Function openmpt_module_get_skip_pattern_num(ByVal module As openmpt_module Ptr) As Long + +/'* \brief Get stop("---") pattern index + + \param module The module handle to work on. + \return The pattern index that represents stop items in the order list. When this order list item is reached, playback continues at the restart position of the current subsong. +'/ +Declare Function openmpt_module_get_stop_pattern_num(ByVal module As openmpt_module Ptr) As Long + /'* \brief Get the number of rows in a pattern \param module The module handle to work on. Index: libopenmpt/libopenmpt.h =================================================================== --- libopenmpt/libopenmpt.h (revision 21858) +++ libopenmpt/libopenmpt.h (working copy) @@ -1330,6 +1330,18 @@ * \return The pattern index found at the given order position of the current sequence. */ LIBOPENMPT_API int32_t openmpt_module_get_order_pattern( openmpt_module * mod, int32_t order ); +/*! \brief Get skip ("+++") pattern index + * + * \param mod The module handle to work on. + * \return The pattern index that represents skip items in the order list. During playback, this order list item is ignored and playback resumes at the next order list item. + */ +LIBOPENMPT_API int32_t openmpt_module_get_skip_pattern_num( openmpt_module * mod ); +/*! \brief Get stop("---") pattern index + * + * \param mod The module handle to work on. + * \return The pattern index that represents stop items in the order list. When this order list item is reached, playback continues at the restart position of the current subsong. + */ +LIBOPENMPT_API int32_t openmpt_module_get_stop_pattern_num( openmpt_module * mod ); /*! \brief Get the number of rows in a pattern * * \param mod The module handle to work on. Index: libopenmpt/libopenmpt.hpp =================================================================== --- libopenmpt/libopenmpt.hpp (revision 21858) +++ libopenmpt/libopenmpt.hpp (working copy) @@ -989,6 +989,18 @@ */ LIBOPENMPT_CXX_API_MEMBER std::int32_t get_order_pattern( std::int32_t order ) const; + //! Get skip ("+++") pattern index + /*! + \return The pattern index that represents skip items in the order list. During playback, this order list item is ignored and playback resumes at the next order list item. + */ + LIBOPENMPT_CXX_API_MEMBER std::int32_t get_skip_pattern_num() const; + + //! Get stop ("---") pattern index + /*! + \return The pattern index that represents stop items in the order list. When this order list item is reached, playback continues at the restart position of the current subsong. + */ + LIBOPENMPT_CXX_API_MEMBER std::int32_t get_stop_pattern_num() const; + //! Get the number of rows in a pattern /*! \param pattern The pattern whose row count should be retrieved. Index: libopenmpt/libopenmpt_c.cpp =================================================================== --- libopenmpt/libopenmpt_c.cpp (revision 21858) +++ libopenmpt/libopenmpt_c.cpp (working copy) @@ -1225,6 +1225,26 @@ return 0; } +int32_t openmpt_module_get_skip_pattern_num( openmpt_module * mod ) { + try { + openmpt::interface::check_soundfile( mod ); + return mod->impl->get_skip_pattern_num(); + } catch ( ... ) { + openmpt::report_exception( __func__, mod ); + } + return 0; +} + +int32_t openmpt_module_get_stop_pattern_num( openmpt_module * mod ) { + try { + openmpt::interface::check_soundfile( mod ); + return mod->impl->get_stop_pattern_num(); + } catch ( ... ) { + openmpt::report_exception( __func__, mod ); + } + return 0; +} + int32_t openmpt_module_get_pattern_num_rows( openmpt_module * mod, int32_t pattern ) { try { openmpt::interface::check_soundfile( mod ); Index: libopenmpt/libopenmpt_cxx.cpp =================================================================== --- libopenmpt/libopenmpt_cxx.cpp (revision 21858) +++ libopenmpt/libopenmpt_cxx.cpp (working copy) @@ -389,6 +389,12 @@ std::int32_t module::get_order_pattern( std::int32_t order ) const { return impl->get_order_pattern( order ); } +std::int32_t module::get_skip_pattern_num() const { + return module_impl::get_skip_pattern_num(); +} +std::int32_t module::get_stop_pattern_num() const { + return module_impl::get_stop_pattern_num(); +} std::int32_t module::get_pattern_num_rows( std::int32_t pattern ) const { return impl->get_pattern_num_rows( pattern ); } Index: libopenmpt/libopenmpt_impl.cpp =================================================================== --- libopenmpt/libopenmpt_impl.cpp (revision 21858) +++ libopenmpt/libopenmpt_impl.cpp (working copy) @@ -1457,6 +1457,12 @@ } return m_sndFile->Order()[o]; } +std::int32_t module_impl::get_skip_pattern_num() { + return OpenMPT::PATTERNINDEX_SKIP; +} +std::int32_t module_impl::get_stop_pattern_num() { + return OpenMPT::PATTERNINDEX_INVALID; +} std::int32_t module_impl::get_pattern_num_rows( std::int32_t p ) const { if ( !mpt::is_in_range( p, std::numeric_limits::min(), std::numeric_limits::max() ) || !m_sndFile->Patterns.IsValidPat( static_cast( p ) ) ) { return 0; Index: libopenmpt/libopenmpt_impl.hpp =================================================================== --- libopenmpt/libopenmpt_impl.hpp (revision 21858) +++ libopenmpt/libopenmpt_impl.hpp (working copy) @@ -244,6 +244,8 @@ std::vector get_instrument_names() const; std::vector get_sample_names() const; std::int32_t get_order_pattern( std::int32_t o ) const; + static std::int32_t get_skip_pattern_num(); + static std::int32_t get_stop_pattern_num(); std::int32_t get_pattern_num_rows( std::int32_t p ) const; std::uint8_t get_pattern_row_channel_command( std::int32_t p, std::int32_t r, std::int32_t c, int cmd ) const; std::string format_pattern_row_channel_command( std::int32_t p, std::int32_t r, std::int32_t c, int cmd ) const;