text_thread.h
上传用户:psq1974
上传日期:2007-01-06
资源大小:1195k
文件大小:3k
源码类别:

mpeg/mp3

开发平台:

C/C++

  1. /* Copyright (C) 1998, 1999 State University of New York at Stony Brook
  2.    Author: Andrew V. Shuvalov ( andrew@ecsl.cs.sunysb.edu )
  3.    Software license is located in file "COPYING"
  4. */
  5. #ifndef text_thread_h
  6. #define text_thread_h
  7. #include "mutex.h"
  8. /** structure that holds text and associated timestamp 
  9. */
  10. struct text_data 
  11. {
  12.   std::string text;
  13.   /** time in string form */
  14.   std::string s_timestamp;
  15.   text_data( const std::string &s ) : text( s )
  16.     {
  17.       s_timestamp.resize( 100 );
  18. #     ifdef WIN32
  19.       SYSTEMTIME st;
  20.       GetSystemTime( &st );
  21.       int l = _snprintf( (char *)s_timestamp.c_str(), s_timestamp.capacity(),
  22. "%04d-%02d-%02d %02d:%02d:%02d", st.wYear, st.wMonth, st.wDay,
  23. st.wHour, st.wMinute, st.wSecond ) + 1;
  24. #     endif
  25.       s_timestamp.resize( l );
  26.     }
  27.   text_data( const text_data &d ) : text( d.text ), 
  28.     s_timestamp( d.s_timestamp )
  29.     {
  30.     }
  31.   const std::string &get_time() const { return s_timestamp; }
  32.   const std::string &get_text() const { return text; }
  33. };
  34. /** hide all comport I/O complexity
  35.  */
  36. class comport 
  37. {
  38.   std::string portname;
  39.   /** open this with CreateFile */
  40.   HANDLE port_h;
  41.   /** mutex to lock shutdown procedure */
  42.   mutex shutdown_mutex;
  43.   /** allows background data loading */
  44.   OVERLAPPED  os;
  45.   /** this var just keep the status of previous call of wait_comport_event()
  46.    */
  47.   DWORD dwEvtMask;
  48.   /** internal buffer where get_data function places intermediate data */
  49.   std::string internal_buffer;
  50.   
  51. public:
  52.   /** arg is com1 or com2. Do not connect immediately */
  53.   comport( const std::string &comport_name );
  54.   /** init only there */
  55.   void init();
  56.   void shutdown();
  57.   ~comport();
  58.   /** this is a blocking call which does not returns until some activity on 
  59.       port happens. We can do that because this thread have nothing to do
  60.       if no data in port. It returns true if new data is awailable. It 
  61.       happens that it returns false if new event is coming but this is 
  62.       not a data event
  63.   */
  64.   bool wait_comport_event();
  65.   /** fill given structures with data. If it happens that data from comport
  66.       are invalid or end-of-line is not reached yet - return NULL.
  67.       The structure is allocated inside this function and pointer is 
  68.       released - you are responsible to clean-up it
  69.   */
  70.   text_data *get_data();
  71. };
  72. /** thread class to work with closed captions grabber */
  73. class text_thread
  74. {
  75.   comport *com_port;
  76.   bool shutdown_now;
  77.   /** mutex to lock shutdown procedure */
  78.   mutex shutdown_mutex;
  79. public:
  80.   /** should take the comport number from args. Do nothing else */
  81.   text_thread( int argc, char **argv );
  82.   ~text_thread()
  83.     {
  84.       shutdown();
  85.     }
  86.   static void text_thread_entry_func( void *_instance );
  87.   void init()
  88.     {
  89.       com_port->init();
  90.     }
  91.   void shutdown()
  92.     {
  93.       wait_for_mutex wm( shutdown_mutex, 3 );
  94.       
  95.       if( com_port == NULL )
  96. return;
  97.       com_port->shutdown();
  98.       delete com_port;
  99.       com_port = NULL;      
  100.     }
  101.   void loop();
  102. };
  103. extern text_thread *textThread;
  104. #endif //  text_thread_h