diff options
Diffstat (limited to 'vdr_stream.c')
-rw-r--r-- | vdr_stream.c | 488 |
1 files changed, 254 insertions, 234 deletions
diff --git a/vdr_stream.c b/vdr_stream.c index 0c12075..4f79224 100644 --- a/vdr_stream.c +++ b/vdr_stream.c @@ -37,295 +37,315 @@ #include <sys/mman.h> #endif -#define DEFAULT_PORT 80 // default port for streaming (HTTP) - +#define DEFAULT_PORT 80 // default port for streaming (HTTP) // --- mgStream ----------------------------------------------------------------- -mgStream::mgStream( std::string filename ) - : m_filename( filename ) +mgStream::mgStream (std::string filename):m_filename (filename) { - m_fd = -1; - m_ismmap = false; - m_buffer = 0; + m_fd = -1; + m_ismmap = false; + m_buffer = 0; } -mgStream::~mgStream() + +mgStream::~mgStream () { - close(); + close (); } -bool mgStream::open(bool log) + +bool mgStream::open (bool log) { - if( m_fd >= 0 ) + if (m_fd >= 0) { - return seek(); + return seek (); } - // just check, whether file exists? - if( fileinfo( log ) ) +// just check, whether file exists? + if (fileinfo (log)) { - printf( "mgStream::open: fileinfo == true\n"); - - if( ( m_fd = ::open( m_filename.c_str(), O_RDONLY ) ) >=0 ) - { - printf( "mgStream::open: file opened\n" ); +// printf ("mgStream::open: fileinfo == true\n"); - m_buffpos = m_readpos = 0; - m_fill = 0; + if ((m_fd =::open (m_filename.c_str (), O_RDONLY)) >= 0) + { + //printf ("mgStream::open: file opened\n"); - printf( "mgStream::open: buffpos, readpos, fill set\n" ); + m_buffpos = m_readpos = 0; + m_fill = 0; - /* -#ifdef USE_MMAP - if( m_filesize <= MAX_MMAP_SIZE ) - { - m_buffer = (unsigned char*)mmap( 0, m_filesize, PROT_READ, - MAP_SHARED, m_fd, 0 ); - if( m_buffer != MAP_FAILED ) - { - m_ismmap = true; - return true; - } - else - { - dsyslog("mmap() failed for %s: %s", m_filename.c_str(), strerror(errno) ); - } - } + //printf ("mgStream::open: buffpos, readpos, fill set\n"); + +/* + #ifdef USE_MMAP + if( m_filesize <= MAX_MMAP_SIZE ) + { + m_buffer = (unsigned char*)mmap( 0, m_filesize, PROT_READ, + MAP_SHARED, m_fd, 0 ); + if( m_buffer != MAP_FAILED ) + { + m_ismmap = true; + return true; + } +else +{ +dsyslog("mmap() failed for %s: %s", m_filename.c_str(), strerror(errno) ); +} +} #endif - */ - printf( "mgStream::open: allocating buffer: %d\n", MP3FILE_BUFSIZE ); - m_buffer = new unsigned char[MP3FILE_BUFSIZE]; - printf( "mgStream::open: buffer allocated\n" ); - - if( m_buffer ) - { - printf( "mgStream::open: buffer allocated, returning true\n" ); - - return true; - } - else - { - esyslog("ERROR: not enough memory for buffer: %s", m_filename.c_str() ); - } - } - else - { - if( log ) - { - esyslog("ERROR: failed to open file %s: %s", m_filename.c_str(), strerror(errno) ); - } - } +*/ + //printf ("mgStream::open: allocating buffer: %d\n", MP3FILE_BUFSIZE); + m_buffer = new unsigned char[MP3FILE_BUFSIZE]; + //printf ("mgStream::open: buffer allocated\n"); + + if (m_buffer) + { + //printf ("mgStream::open: buffer allocated, returning true\n"); + + return true; + } + else + { + esyslog ("ERROR: not enough memory for buffer: %s", + m_filename.c_str ()); + } + } + else + { + if (log) + { + esyslog ("ERROR: failed to open file %s: %s", + m_filename.c_str (), strerror (errno)); + } + } } - close(); - printf( "mgStream::open: returning false\n" ); - return false; + close (); + //printf ("mgStream::open: returning false\n"); + return false; } -void mgStream::close(void) + +void +mgStream::close (void) { #ifdef USE_MMAP - if( m_ismmap ) - { - munmap( m_buffer, m_filesize ); - m_buffer = 0; - m_ismmap = false; + if (m_ismmap) + { + munmap (m_buffer, m_filesize); + m_buffer = 0; + m_ismmap = false; } - else + else { #endif - delete m_buffer; - m_buffer = 0; + delete m_buffer; + m_buffer = 0; #ifdef USE_MMAP } #endif - if( m_fd >= 0 ) - { - ::close( m_fd ); - m_fd = -1; + if (m_fd >= 0) + { + ::close (m_fd); + m_fd = -1; } } -bool mgStream::seek(unsigned long long pos) + +bool mgStream::seek (unsigned long long pos) { - printf( "mgStream::seek\n" ); - if( m_fd >= 0 && pos >= 0 && pos <= m_filesize ) + //printf ("mgStream::seek\n"); + if (m_fd >= 0 && pos >= 0 && pos <= m_filesize) { - printf( "mgStream::seek valid file and position detected\n" ); - - m_buffpos = 0; - m_fill = 0; - - if( m_ismmap ) - { - m_readpos = pos; - - printf( "mgStream::seek: returning true\n" ); - return true; - } - else - { - if( ( m_readpos = lseek64( m_fd, pos, SEEK_SET ) ) >=0 ) - { - if( m_readpos != pos ) - { - dsyslog( "seek mismatch in %s, wanted %lld, got %lld", m_filename.c_str(), pos, m_readpos ); - } - printf( "mgStream::seek: returning true\n" ); - return true; - } - else - { - esyslog( "ERROR: seeking failed in %s: %d,%s", m_filename.c_str(), errno, strerror(errno) ); - } - } + //printf ("mgStream::seek valid file and position detected\n"); + + m_buffpos = 0; + m_fill = 0; + + if (m_ismmap) + { + m_readpos = pos; + + //printf ("mgStream::seek: returning true\n"); + return true; + } + else + { + if ((m_readpos = lseek64 (m_fd, pos, SEEK_SET)) >= 0) + { + if (m_readpos != pos) + { + dsyslog ("seek mismatch in %s, wanted %lld, got %lld", + m_filename.c_str (), pos, m_readpos); + } + //printf ("mgStream::seek: returning true\n"); + return true; + } + else + { + esyslog ("ERROR: seeking failed in %s: %d,%s", + m_filename.c_str (), errno, strerror (errno)); + } + } } - else + else { - printf( "mp3: bad seek call fd=%d pos=%lld name=%s\n", m_fd, pos, m_filename.c_str() ); + //printf ("mp3: bad seek call fd=%d pos=%lld name=%s\n", m_fd, pos, + //m_filename.c_str ()); } - - printf( "mgStream::seek: returning false\n" ); - return false; + + //printf ("mgStream::seek: returning false\n"); + return false; } -bool mgStream::stream(unsigned char * &data, - unsigned long &len, - const unsigned char *rest) + +bool +mgStream::stream (unsigned char *&data, +unsigned long &len, const unsigned char *rest) { - if( m_fd >= 0 ) + if (m_fd >= 0) { - if( m_readpos < m_filesize ) - { - if( m_ismmap ) - { - if( rest && m_fill ) - { - m_readpos = (rest - m_buffer); // take care of remaining data - } - m_fill = m_filesize - m_readpos; - data = m_buffer + m_readpos; - len = m_fill; - m_buffpos = m_readpos; - m_readpos += m_fill; - - return true; - } - else - { - if( rest && m_fill ) - { // copy remaining data to start of buffer - m_fill -= ( rest - m_buffer); // remaing bytes - memmove( m_buffer, rest, m_fill ); - } - else - { - m_fill = 0; - } - - int r; - do - { - r = read( m_fd, m_buffer + m_fill, - MP3FILE_BUFSIZE - m_fill ); - } while( r == -1 && errno == EINTR ); - - if( r >= 0 ) - { - m_buffpos = m_readpos - m_fill; - m_readpos += r; - m_fill += r; - data = m_buffer; - len = m_fill; - - return true; - } - else - { - esyslog("ERROR: read failed in %s: %d,%s", m_filename.c_str(), errno, strerror(errno) ); - } - } - } - else - { - len = 0; - return true; - } + if (m_readpos < m_filesize) + { + if (m_ismmap) + { + if (rest && m_fill) + { + m_readpos = (rest - m_buffer);// take care of remaining data + } + m_fill = m_filesize - m_readpos; + data = m_buffer + m_readpos; + len = m_fill; + m_buffpos = m_readpos; + m_readpos += m_fill; + + return true; + } + else + { + if (rest && m_fill) + { // copy remaining data to start of buffer + m_fill -= (rest - m_buffer); // remaing bytes + memmove (m_buffer, rest, m_fill); + } + else + { + m_fill = 0; + } + + int r; + do + { + r = read (m_fd, m_buffer + m_fill, + MP3FILE_BUFSIZE - m_fill); + } + while (r == -1 && errno == EINTR); + + if (r >= 0) + { + m_buffpos = m_readpos - m_fill; + m_readpos += r; + m_fill += r; + data = m_buffer; + len = m_fill; + + return true; + } + else + { + esyslog ("ERROR: read failed in %s: %d,%s", + m_filename.c_str (), errno, strerror (errno)); + } + } + } + else + { + len = 0; + return true; + } } - return false; + return false; } -bool mgStream::removable() + +bool mgStream::removable () { - // we do not handle removable media at this time - return false; +// we do not handle removable media at this time + return false; } -bool mgStream::fileinfo( bool log ) + +bool mgStream::fileinfo (bool log) { - struct stat64 ds; - - if( !stat64( m_filename.c_str(), &ds ) ) + struct stat64 + ds; + + if (!stat64 (m_filename.c_str (), &ds)) { - printf( "mgStream::fileinfo: stat64 == 0\n" ); - - if( S_ISREG( ds.st_mode ) ) - { - m_fsID = ""; - m_fsType = 0; - - struct statfs64 sfs; - - if( !statfs64( m_filename.c_str(), &sfs) ) - { - if( removable() ) - { - char *tmpbuf; - asprintf( &tmpbuf, "%llx:%llx", sfs.f_blocks, sfs.f_files ); - m_fsID = tmpbuf; - free( tmpbuf ); - } - m_fsType = sfs.f_type; - } - else - { - if( errno != ENOSYS && log ) - { - esyslog("ERROR: can't statfs %s: %s", m_filename.c_str(), strerror(errno) ); - } - } - - m_filesize = ds.st_size; - m_ctime = ds.st_ctime; - + //printf ("mgStream::fileinfo: stat64 == 0\n"); + + if (S_ISREG (ds.st_mode)) + { + m_fsID = ""; + m_fsType = 0; + + struct statfs64 + sfs; + + if (!statfs64 (m_filename.c_str (), &sfs)) + { + if (removable ()) + { + char * + tmpbuf; + asprintf (&tmpbuf, "%llx:%llx", sfs.f_blocks, sfs.f_files); + m_fsID = tmpbuf; + free (tmpbuf); + } + m_fsType = sfs.f_type; + } + else + { + if (errno != ENOSYS && log) + { + esyslog ("ERROR: can't statfs %s: %s", m_filename.c_str (), + strerror (errno)); + } + } + + m_filesize = ds.st_size; + m_ctime = ds.st_ctime; + #ifdef CDFS_MAGIC - if( m_fsType == CDFS_MAGIC ) - { - m_ctime=0; // CDFS returns mount time as ctime - } + if (m_fsType == CDFS_MAGIC) + { + m_ctime = 0; // CDFS returns mount time as ctime + } #endif - // infodone tells that info has been read, like a cache flag - // InfoDone(); - return true; +// infodone tells that info has been read, like a cache flag +// InfoDone(); + return true; + } + else + { + if (log) + { + esyslog ("ERROR: %s is not a regular file", + m_filename.c_str ()); + } } - else - { - if(log) - { - esyslog("ERROR: %s is not a regular file", m_filename.c_str() ); - } - } } - else + else { - if(log) - { - esyslog("ERROR: can't stat %s: %s", m_filename.c_str(), strerror(errno) ); - } + if (log) + { + esyslog ("ERROR: can't stat %s: %s", m_filename.c_str (), + strerror (errno)); + } - printf( "mgStream::fileinfo: stat64 != 0 for %s\n", m_filename.c_str() ); + //printf ("mgStream::fileinfo: stat64 != 0 for %s\n", + // m_filename.c_str ()); } - - return false; + + return false; } |