1. Друзья, в это тяжёлое и непонятное для всех нас время мы просим вас воздержаться от любых упоминаний политики на форуме, - этим ситуации не поможешь, а только возникнут ненужные ссоры и обиды. Это касается также шуток и юмора на тему конфликта. Пусть войны будут только виртуальными, а политики решают разногласия дипломатическим путём. С уважением, администрация Old-Games.RU.

    Скрыть объявление
  2. Пожалуйста, внимательно прочитайте правила раздела.
  3. Если Вы видите это сообщение, значит, вы ещё не зарегистрировались на нашем форуме.

    Зарегистрируйтесь, если вы хотите принять участие в обсуждениях. Перед регистрацией примите к сведению:
    1. Не регистрируйтесь с никами типа asdfdadhgd, 354621 и тому подобными, не несущими смысловой нагрузки (ник должен быть читаемым!): такие пользователи будут сразу заблокированы!
    2. Не регистрируйте больше одной учётной записи. Если у вас возникли проблемы при регистрации, то вы можете воспользоваться формой обратной связи внизу страницы.
    3. Регистрируйтесь с реально существующими E-mail адресами, иначе вы не сможете завершить регистрацию.
    4. Обязательно ознакомьтесь с правилами поведения на нашем форуме, чтобы избежать дальнейших конфликтов и непонимания.
    С уважением, администрация форума Old-Games.RU
    Скрыть объявление

Кодерский уголок

Тема в разделе "Мастерская", создана пользователем Dimouse, 10 сен 2006.

  1. Dimouse King of Mice

    Dimouse

    Администратор Переводчик

    Регистрация:
    18 апр 2003
    Сообщения:
    34.678
    В соответствии с назначением раздела, в этой теме предполагается обсуждать конкретные вопросы, которые у вас возникают при создании своих программ (в частности - игр), помогать другим, размещать полезные ссылки на статьи и материалы, которые могут пригодиться другим.

    Что здесь не допускается:
    - беспорядочный флуд на всевозможные темы, в том числе общие обсуждения языков программирования без конкретики (карается по статье "флуд и оффтопик" *),
    - разжигания на темы "что лучше, Си или Си++ и чем они отличаются?", "какой язык программирования лучше X или Y?" и т.п. (карается по статье "флейм и участие в холиварах" *),
    - мерение пиписьками в стиле "я лучше программирую" или "ты не умеешь программировать" (карается по статье "оскорбление участников и их взглядов" *).

    Всё это допускается в специально созданной теме "Беседка для программистов или «Бутерброд с кодом».

    * по усмотрению модератора также возможно применение блокировки в данной теме.

    Оригинальное сообщение
     
    Последнее редактирование модератором: 24 ноя 2014
    CY8R4Y нравится это.
  2.  
  3. nop

    nop

    Регистрация:
    5 дек 2014
    Сообщения:
    2.297
    Повторяю вопрос. В контексте решения обсуждаемых нами задач, вкратце Как он делается, и чего позволяет добиться?
     
    Последнее редактирование: 15 янв 2015
    Рыжий Тигра нравится это.
  4. Bato-San Чеширский волк-киборг

    Bato-San

    Регистрация:
    24 июн 2010
    Сообщения:
    14.136
    nop, и то и другое написано в документации на 8259A. Если лень искать и изучать - значит вам это знать не нужно и вопрос теряет смысл. Если нужно и не лень - вопрос теряет смысл. :)
     
  5. Рыжий Тигра Сам себе «пират»

    Рыжий Тигра

    Регистрация:
    3 май 2012
    Сообщения:
    1.823
    Bato-San, давай-давай, колись!

    nop, дожимай! :-)
     
    AxXxB нравится это.
  6. AxXxB неадекват

    AxXxB

    Хелпер Переводчик

    Регистрация:
    13 ноя 2006
    Сообщения:
    1.663
    Да нельзя контроллер прерываний перехватить, что это вообще значит, перехват контроллера?) Типа чтобы запросы на прерывания сначала куда-то к нам шли, а потом в него? Ну да, можно так. Только не программно)

    А по поводу таймера - можно, в принципе, любой из трех каналов использовать. Нулевой - "хуком" int 8 и перепрограммированием, первый - просто программированием, второй - отключением пищалки и программированием. Перехватывать int 8 очень удобно, когда надо резидентом висеть, чтобы "нормальные" каналы свободными остались.
     
  7. nop

    nop

    Регистрация:
    5 дек 2014
    Сообщения:
    2.297
    AxXxB, Да тут как бы народ в курсе того, что можно сделать с таймером. Но ждем от нашего гуру Bato-san разъяснений, как через "перехватывание контроллера прерываний" можно сделать:
    :D
     
    Рыжий Тигра и AxXxB нравится это.
  8. Bato-San Чеширский волк-киборг

    Bato-San

    Регистрация:
    24 июн 2010
    Сообщения:
    14.136
    AxXxB,
    nop, вы умудрились придраться к одному слову не поняв к чему это было сказано вообще. Это раз. Два - вы пропустили целый пост в котором был пример этого "всё", тоже с документацией, которую вы так не любите читать, надо сказать). И три - сами шутите и сами смеётесь. Притом совершенно напрасно.

    И, да - контроллер тоже можно "перехватить". Чисто программно. RTFM.:facepalm:
     
  9. AxXxB неадекват

    AxXxB

    Хелпер Переводчик

    Регистрация:
    13 ноя 2006
    Сообщения:
    1.663
    Offtop
    Если уж придираться, то там было написано
    :D

    Никто тут не придирается к словам. Просто народ не понимает иногда, что ты пишешь, как и в этом случае. А ты при этом встаешь в позу и тратишь кучу времени на то, чтобы потрясти кулаками в воздухе, вместо того, чтобы написать 4-5 ключевых слов, по которым можно что-нибудь нагуглить. С этой точки зрения даже Фримен был гораздо более многословен :)

    Вот ненавижу вот это вот "я писал, ищите, а до вас я не снизойду" :)

    Ну, в отдельных случаях, наверно, можно, но уж точно не здесь.

    Кстати, в даташите на 8259А ни про какой перехват ничего нет, я 2 раза перепроверил)

    Не, ну а как тут не смеяться, когда человек не может сказать "Сорри, ошибся второпях, лишнее слово написал")

    Не в обиду, ты классный специалист, но ведь есть когда есть куда расти (не в тех. плане, я имею в виду), надо жыш ведь расти!)
     
    daemolisher, nop, Рыжий Тигра и ещё 1-му нравится это.
  10. nop

    nop

    Регистрация:
    5 дек 2014
    Сообщения:
    2.297
    Offtop
    Так что, Bato-san не собирается отвечать за базар?
    Очень круто сделать что конкретно? Расскажи, как и для чего перехватывают контроллер прерываний? Очень хочу, наконец, бросить работу и начать жить припеваючи!
    Или сейчас появится предложение заплатить?
    А нам Bato-san заплатит, за время, потерянное на чтение ничего полезного не дающей документации?
    На всякий случай уточню: Что именно можно сделать с контроллером прерываний, я как бы знаю. Вопрос тут: Чем это нам поможет?

    Я как раз недавно анекдот почти в тему читал, тут или где-то еще, не помню. Вот, нагуглил примерно такой же:
     
    Последнее редактирование: 15 янв 2015
    daemolisher и Рыжий Тигра нравится это.
  11. Рыжий Тигра Сам себе «пират»

    Рыжий Тигра

    Регистрация:
    3 май 2012
    Сообщения:
    1.823
    Offtop
    nop, классный анекдот. Вроде иска про кота из "Трассы 60", но коонцентрированнее и доходчивее. :-)
     
  12. Andrew Clark

    Andrew Clark

    Регистрация:
    30 дек 2014
    Сообщения:
    31
    А его отдохнуть отправили за стиль общения?
     
  13. AxXxB неадекват

    AxXxB

    Хелпер Переводчик

    Регистрация:
    13 ноя 2006
    Сообщения:
    1.663
    Andrew Clark, не помню уже, в чем там дело было.
     
  14. Рыжий Тигра Сам себе «пират»

    Рыжий Тигра

    Регистрация:
    3 май 2012
    Сообщения:
    1.823
    На случай вдруг кому окажется полезным - дарю <stdint.h> для micro$oft visual studio. Юзаю более-менее шестой год с MSVC6, весьма удобен, на глюки ни разу никто из моих знакомых не жаловался. Где я его нарыл - уже в упор не помню. :-(
    Код:
    // ISO C9x  compliant stdint.h for Microsoft Visual Studio
    // Based on ISO/IEC 9899:TC2 Committee draft (May 6, 2005) WG14/N1124 
    // 
    //  Copyright (c) 2006 Alexander Chemeris
    // 
    // Redistribution and use in source and binary forms, with or without
    // modification, are permitted provided that the following conditions are met:
    // 
    //   1. Redistributions of source code must retain the above copyright notice,
    //      this list of conditions and the following disclaimer.
    // 
    //   2. Redistributions in binary form must reproduce the above copyright
    //      notice, this list of conditions and the following disclaimer in the
    //      documentation and/or other materials provided with the distribution.
    // 
    //   3. The name of the author may be used to endorse or promote products
    //      derived from this software without specific prior written permission.
    // 
    // THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
    // WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
    // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
    // EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
    // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
    // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
    // OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 
    // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
    // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
    // ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    // 
    ///////////////////////////////////////////////////////////////////////////////
    
    #ifndef _MSC_VER // [
    #error "Use this header only with Microsoft Visual C++ compilers!"
    #endif // _MSC_VER ]
    
    #ifndef _MSC_STDINT_H_ // [
    #define _MSC_STDINT_H_
    
    #if _MSC_VER > 1000
    #pragma once
    #endif
    
    #include <limits.h>
    
    // For Visual Studio 6 in C++ mode wrap <wchar.h> include with 'extern "C++" {}'
    // or compiler give many errors like this:
    //   error C2733: second C linkage of overloaded function 'wmemchr' not allowed
    #if (_MSC_VER < 1300) && defined(__cplusplus)
       extern "C++" {
    #endif 
    #     include <wchar.h>
    #if (_MSC_VER < 1300) && defined(__cplusplus)
       }
    #endif
    
    // 7.18.1 Integer types
    
    // 7.18.1.1 Exact-width integer types
    typedef __int8            int8_t;
    typedef __int16           int16_t;
    typedef __int32           int32_t;
    typedef __int64           int64_t;
    typedef unsigned __int8   uint8_t;
    typedef unsigned __int16  uint16_t;
    typedef unsigned __int32  uint32_t;
    typedef unsigned __int64  uint64_t;
    
    // 7.18.1.2 Minimum-width integer types
    typedef int8_t    int_least8_t;
    typedef int16_t   int_least16_t;
    typedef int32_t   int_least32_t;
    typedef int64_t   int_least64_t;
    typedef uint8_t   uint_least8_t;
    typedef uint16_t  uint_least16_t;
    typedef uint32_t  uint_least32_t;
    typedef uint64_t  uint_least64_t;
    
    // 7.18.1.3 Fastest minimum-width integer types
    typedef int8_t    int_fast8_t;
    typedef int16_t   int_fast16_t;
    typedef int32_t   int_fast32_t;
    typedef int64_t   int_fast64_t;
    typedef uint8_t   uint_fast8_t;
    typedef uint16_t  uint_fast16_t;
    typedef uint32_t  uint_fast32_t;
    typedef uint64_t  uint_fast64_t;
    
    // 7.18.1.4 Integer types capable of holding object pointers
    #ifdef _WIN64 // [
       typedef __int64           intptr_t;
       typedef unsigned __int64  uintptr_t;
    #else // _WIN64 ][
       typedef int               intptr_t;
       typedef unsigned int      uintptr_t;
    #endif // _WIN64 ]
    
    // 7.18.1.5 Greatest-width integer types
    typedef int64_t   intmax_t;
    typedef uint64_t  uintmax_t;
    
    
    // 7.18.2 Limits of specified-width integer types
    
    #if !defined(__cplusplus) || defined(__STDC_LIMIT_MACROS) // [   See footnote 220 at page 257 and footnote 221 at page 259
    
    // 7.18.2.1 Limits of exact-width integer types
    #define INT8_MIN     ((int8_t)_I8_MIN)
    #define INT8_MAX     _I8_MAX
    #define INT16_MIN    ((int16_t)_I16_MIN)
    #define INT16_MAX    _I16_MAX
    #define INT32_MIN    ((int32_t)_I32_MIN)
    #define INT32_MAX    _I32_MAX
    #define INT64_MIN    ((int64_t)_I64_MIN)
    #define INT64_MAX    _I64_MAX
    #define UINT8_MAX    _UI8_MAX
    #define UINT16_MAX   _UI16_MAX
    #define UINT32_MAX   _UI32_MAX
    #define UINT64_MAX   _UI64_MAX
    
    // 7.18.2.2 Limits of minimum-width integer types
    #define INT_LEAST8_MIN    INT8_MIN
    #define INT_LEAST8_MAX    INT8_MAX
    #define INT_LEAST16_MIN   INT16_MIN
    #define INT_LEAST16_MAX   INT16_MAX
    #define INT_LEAST32_MIN   INT32_MIN
    #define INT_LEAST32_MAX   INT32_MAX
    #define INT_LEAST64_MIN   INT64_MIN
    #define INT_LEAST64_MAX   INT64_MAX
    #define UINT_LEAST8_MAX   UINT8_MAX
    #define UINT_LEAST16_MAX  UINT16_MAX
    #define UINT_LEAST32_MAX  UINT32_MAX
    #define UINT_LEAST64_MAX  UINT64_MAX
    
    // 7.18.2.3 Limits of fastest minimum-width integer types
    #define INT_FAST8_MIN    INT8_MIN
    #define INT_FAST8_MAX    INT8_MAX
    #define INT_FAST16_MIN   INT16_MIN
    #define INT_FAST16_MAX   INT16_MAX
    #define INT_FAST32_MIN   INT32_MIN
    #define INT_FAST32_MAX   INT32_MAX
    #define INT_FAST64_MIN   INT64_MIN
    #define INT_FAST64_MAX   INT64_MAX
    #define UINT_FAST8_MAX   UINT8_MAX
    #define UINT_FAST16_MAX  UINT16_MAX
    #define UINT_FAST32_MAX  UINT32_MAX
    #define UINT_FAST64_MAX  UINT64_MAX
    
    // 7.18.2.4 Limits of integer types capable of holding object pointers
    #ifdef _WIN64 // [
    #  define INTPTR_MIN   INT64_MIN
    #  define INTPTR_MAX   INT64_MAX
    #  define UINTPTR_MAX  UINT64_MAX
    #else // _WIN64 ][
    #  define INTPTR_MIN   INT32_MIN
    #  define INTPTR_MAX   INT32_MAX
    #  define UINTPTR_MAX  UINT32_MAX
    #endif // _WIN64 ]
    
    // 7.18.2.5 Limits of greatest-width integer types
    #define INTMAX_MIN   INT64_MIN
    #define INTMAX_MAX   INT64_MAX
    #define UINTMAX_MAX  UINT64_MAX
    
    // 7.18.3 Limits of other integer types
    
    #ifdef _WIN64 // [
    #  define PTRDIFF_MIN  _I64_MIN
    #  define PTRDIFF_MAX  _I64_MAX
    #else  // _WIN64 ][
    #  define PTRDIFF_MIN  _I32_MIN
    #  define PTRDIFF_MAX  _I32_MAX
    #endif  // _WIN64 ]
    
    #define SIG_ATOMIC_MIN  INT_MIN
    #define SIG_ATOMIC_MAX  INT_MAX
    
    #ifndef SIZE_MAX // [
    #  ifdef _WIN64 // [
    #     define SIZE_MAX  _UI64_MAX
    #  else // _WIN64 ][
    #     define SIZE_MAX  _UI32_MAX
    #  endif // _WIN64 ]
    #endif // SIZE_MAX ]
    
    // WCHAR_MIN and WCHAR_MAX are also defined in <wchar.h>
    #ifndef WCHAR_MIN // [
    #  define WCHAR_MIN  0
    #endif  // WCHAR_MIN ]
    #ifndef WCHAR_MAX // [
    #  define WCHAR_MAX  _UI16_MAX
    #endif  // WCHAR_MAX ]
    
    #define WINT_MIN  0
    #define WINT_MAX  _UI16_MAX
    
    #endif // __STDC_LIMIT_MACROS ]
    
    
    // 7.18.4 Limits of other integer types
    
    #if !defined(__cplusplus) || defined(__STDC_CONSTANT_MACROS) // [   See footnote 224 at page 260
    
    // 7.18.4.1 Macros for minimum-width integer constants
    
    #define INT8_C(val)  val##i8
    #define INT16_C(val) val##i16
    #define INT32_C(val) val##i32
    //#define INT64_C(val) val##i64
    
    #define UINT8_C(val)  val##ui8
    #define UINT16_C(val) val##ui16
    #define UINT32_C(val) val##ui32
    //#define UINT64_C(val) val##ui64
    
    // 7.18.4.2 Macros for greatest-width integer constants
    #define INTMAX_C   INT64_C
    #define UINTMAX_C  UINT64_C
    
    #endif // __STDC_CONSTANT_MACROS ]
    
    #endif // _MSC_STDINT_H_ ]
    Обратите внимание на квадратные скобки в комментах при #ifdef/#endif - полезный трюк, капитально облегчает поиск соответствия ctrl-}'ом. Тоже беру на вооружение.

    Само собой, этим типам не помешает syntax highlighting. В MSVC6, на котором пока сижу, есть "пользовательская подсветка" - это текстовый файл %MSDevDir%\bin\usertype.dat, cейчас он у меня вот такой:
    Код:
    int8_t
    uint8_t
    int16_t
    uint16_t
    int32_t
    uint32_t
    int64_t
    uint64_t
    uint_t
    intptr_t
    uintptr_t
    intmax_t
    uintmax_t
     
    Последнее редактирование: 28 янв 2015
    Butz, nop и AxXxB нравится это.
  15. Geryon

    Geryon

    Регистрация:
    13 май 2008
    Сообщения:
    1.228
    Всем, кто помогал мне в борьбе с компиляцией libsidplayfp под DOS ( nop, Steel Rat, Рыжий Тигра, A.P.$lasH ) - вот как это сейчас выглядит на реальном железе (проц - AMD K6-2/500):



    Здесь еще нет никаких обработчиков таймеров. Вот будет у меня новая реплика карты, изображенная на видео - буду продолжать разработку. Самое смешное, что у меня ни на одном компе так и не заработало нормально, так что, если бы не Fagear, я бы так и не узнал, что кое-что все-таки проигрывается.

    Кстати, если кто-то захотел себе такую реплику - еще не поздно отписаться в соответствующей теме на форуме Vogons.

    1748b73a2a7a8899d2c6035d9dfcfb0e.png
     
    Последнее редактирование модератором: 12 июн 2015
    SAS, nop, A.P.$lasH и 3 другим нравится это.
  16. nop

    nop

    Регистрация:
    5 дек 2014
    Сообщения:
    2.297
    Geryon, Слушай, если б проект таки попал на git, я бы мог поучаствовать в намного большем объеме. Если тебе хочется все сделать обязательно самому - нет проблем, конечно.

    ---------- Сообщение добавлено в 17:03 ---------- Предыдущее сообщение размещено в 17:00 ----------

    А цена там есть?
     
  17. Geryon

    Geryon

    Регистрация:
    13 май 2008
    Сообщения:
    1.228
    Насчет проекта на git я еще подумаю. Лень с git разбираться, конечно, но, думаю, это можно решить просмотром какого-нибудь обучающего видео на youtube.

    Тут еще дело в том, что libsidplayfp, как видно, требует 500 МГц процессора для нормальной работы. Возможно, придется взять за основу какой-нибудь другой, менее прожорливый эмулятор, и делать заново.

    Цены там есть, от $25 за голую PCB до $45 за полностью собранную, за исключением самого SID-чипа.
     
  18. Bato-San Чеширский волк-киборг

    Bato-San

    Регистрация:
    24 июн 2010
    Сообщения:
    14.136
    Geryon, вот толпа проигрывателей SID Только возникает вопрос, а зачем полную эмуляцию тащить под дос, если логичнее сделать например анализатор-конвертор сидов в некий общий формат, который можно будет напрямую кидать в SSI ?

    Опа-опа ! Оказывается был уже похожий проект на ZX Spectrum. И железка была и эмуляция. А это вам не 500Mhz !
     
    Последнее редактирование: 30 янв 2015
  19. Geryon

    Geryon

    Регистрация:
    13 май 2008
    Сообщения:
    1.228
    Это для меня слишком трудоемко. Еле время нахожу расковырять чужой эмулятор, куда уж писать с нуля. Возможно, найду какой-нибудь не очень ресурсоемкий эмулятор, чтоб на 386 шел. Ну а владельцы XT и 286 как-нибудь переживут.
     
    Последнее редактирование: 30 янв 2015
  20. Bato-San Чеширский волк-киборг

    Bato-San

    Регистрация:
    24 июн 2010
    Сообщения:
    14.136
    Geryon, попробуй найти ребят из спековского проекта.
     
  21. nop

    nop

    Регистрация:
    5 дек 2014
    Сообщения:
    2.297
    Geryon, Нечего учить, просто инстальни для начала :) Если копать глубоко, то можно и закопаться, но простые вещи делаются просто :)
     
  22. Рыжий Тигра Сам себе «пират»

    Рыжий Тигра

    Регистрация:
    3 май 2012
    Сообщения:
    1.823
    Прошу консультации мастеров.
    Будучи полным чайником в COM'е вообще и в DirectShow в частности, мне пришлось строить фильтр-перехватчик потока субтитров с целью их подмены "на лету". Использовать CSampleGrabber не хочется - чересчур уж громоздкий, к тому же его интерфейсная часть мне совершенно не нужна.
    Пока получилась вот такая крохотулечка из трёх функций:
    Код:
    #include <streams.h>     // Active Movie (includes windows.h)
    
    class subhook_c: public CTransInPlaceFilter {
    protected:
      void *m_opaque;
    public:
      subhook_c( HRESULT* phr, void *opaque );
    //  ~subhook_c();
      HRESULT Transform( IMediaSample *pSample );
      HRESULT CheckInputType( const CMediaType* mtIn );
    };
    
    #include <initguid.h>  // declares DEFINE_GUID to declare an EXTERN_C const.
    #include "matroska.h"  // для MEDIATYPE_Subtitle
    
    // {49156D8B-80FA-4bd5-984C-5E4753E49234}
    DEFINE_GUID(CLSID_subhook, 
    0x49156d8b, 0x80fa, 0x4bd5, 0x98, 0x4c, 0x5e, 0x47, 0x53, 0xe4, 0x92, 0x34);
    
    subhook_c::subhook_c( HRESULT* phr, void *opaque )
        : CTransInPlaceFilter( TEXT("subtitle hook"), NULL, CLSID_subhook, phr, TRUE ) {
      m_opaque = opaque;
    }
    
    HRESULT subhook_c::CheckInputType( const CMediaType* mtIn ) {
      if ( mtIn->majortype != MEDIATYPE_Subtitle )
        return ( VFW_E_INVALID_MEDIA_TYPE );
      return ( S_OK );
    }
    
    HRESULT subhook_c::Transform( IMediaSample *pSample ) {
      HRESULT hr;
      unsigned char *data;
      int in_size, out_size;
      int64_t start_time, stop_time;
    
    // здесь будет выбор субтитра для замены
    #ifndef NDEBUG // [
    // для отладки - пока берём константы: 
      int start_delta = -5000000, end_delta = -5000000; // в гектонанах, т.е. по полсекунды
      char line[] = "Test of very-very long line replacement "
        "123456789 " "123456789 " "123456789 " "123456789 " "123456789 " 
        "123456789 " "123456789 " "123456789 " "123456789 " "123456789 " 
        ;
      out_size = strlen( line );
    #endif // NDEBUG ]
    
      if ( ( hr = pSample->GetPointer( &data ) ) != S_OK )
        return ( hr );
      pSample->GetTime( &start_time, &stop_time );
      in_size = pSample->GetSize(); // опытным путём намерял 1040 байт, хватит с головой
      if ( ( out_size <= 0 )
        return ( S_FALSE ); // пропускаем субтитр
      else if ( out_size > in_size )
        return ( S_OK ); // не изменяем
    
    // чтобы можно было сдвигать субтитр раньше-позже по времени
    #ifndef NDEBUG // [
      start_time += start_delta; stop_time += end_delta;
    #endif // ]
      pSample->SetTime( &start_time, &stop_time );
    
      pSample->SetActualDataLength( out_size );
      memcpy( data, line, out_size );
    
      return ( S_OK );
    }
    Вопрос знатокам: что ещё из позарез нужного я упустил? Навскидку - размером буфера неплохо бы управлять, а не надеяться что сам угадается подходящий, но как?
    И ещё - если просто добавить в граф этот фильтр, то при RenderFile() он автоматом в цепочку обработки субтитров не цепляется - пришлось разрывать соединение сплиттера с VobSub'ом и вставлять туда мою крошку. Но CSampleGrabber точно так же ведёт себя с MEDIATYPE_Subtitle, я проверил. В чём может быть грабля?
     
    Последнее редактирование: 5 фев 2015
  1. На этом сайте используются файлы cookie, чтобы персонализировать содержимое, хранить Ваши предпочтения и держать Вас авторизованным в системе, если Вы зарегистрировались.
    Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie.
    Скрыть объявление