mirror of
				https://github.com/f4exb/sdrangel.git
				synced 2025-11-03 21:20:31 -05:00 
			
		
		
		
	File Input: Fix seeking over .wav header
This commit is contained in:
		
							parent
							
								
									d259443203
								
							
						
					
					
						commit
						d496744c2a
					
				@ -61,6 +61,7 @@ FileInput::FileInput(DeviceAPI *deviceAPI) :
 | 
				
			|||||||
	m_sampleRate(48000),
 | 
						m_sampleRate(48000),
 | 
				
			||||||
	m_sampleSize(0),
 | 
						m_sampleSize(0),
 | 
				
			||||||
	m_centerFrequency(435000000),
 | 
						m_centerFrequency(435000000),
 | 
				
			||||||
 | 
					    m_dataStartPos(0),
 | 
				
			||||||
	m_recordLengthMuSec(0),
 | 
						m_recordLengthMuSec(0),
 | 
				
			||||||
    m_startingTimeStamp(0)
 | 
					    m_startingTimeStamp(0)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@ -156,11 +157,11 @@ void FileInput::openFileStream()
 | 
				
			|||||||
        if (headerOK && (m_sampleRate > 0) && (m_sampleSize > 0))
 | 
					        if (headerOK && (m_sampleRate > 0) && (m_sampleSize > 0))
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
#ifdef ANDROID
 | 
					#ifdef ANDROID
 | 
				
			||||||
            qint64 pos = m_inputFile.pos();
 | 
					            m_dataStartPos = m_inputFile.pos();
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
            qint64 pos = m_ifstream.tellg();
 | 
					            m_dataStartPos = m_ifstream.tellg();
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
            m_recordLengthMuSec = ((fileSize - pos) * 1000000UL) / ((m_sampleSize == 24 ? 8 : 4) * m_sampleRate);
 | 
					            m_recordLengthMuSec = ((fileSize - m_dataStartPos) * 1000000UL) / ((m_sampleSize == 24 ? 8 : 4) * m_sampleRate);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        else
 | 
					        else
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
@ -184,6 +185,7 @@ void FileInput::openFileStream()
 | 
				
			|||||||
	    m_ifstream.seekg(0,std::ios_base::beg);
 | 
						    m_ifstream.seekg(0,std::ios_base::beg);
 | 
				
			||||||
		bool crcOK = FileRecord::readHeader(m_ifstream, header);
 | 
							bool crcOK = FileRecord::readHeader(m_ifstream, header);
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
							m_dataStartPos = sizeof(FileRecord::Header);
 | 
				
			||||||
        m_sampleRate = header.sampleRate;
 | 
					        m_sampleRate = header.sampleRate;
 | 
				
			||||||
		m_centerFrequency = header.centerFrequency;
 | 
							m_centerFrequency = header.centerFrequency;
 | 
				
			||||||
		m_startingTimeStamp = header.startTimeStamp;
 | 
							m_startingTimeStamp = header.startTimeStamp;
 | 
				
			||||||
@ -193,7 +195,7 @@ void FileInput::openFileStream()
 | 
				
			|||||||
	    if (crcOK && (m_sampleRate > 0) && (m_sampleSize > 0))
 | 
						    if (crcOK && (m_sampleRate > 0) && (m_sampleSize > 0))
 | 
				
			||||||
	    {
 | 
						    {
 | 
				
			||||||
	        qDebug("FileInput::openFileStream: CRC32 OK for header: %s", qPrintable(crcHex));
 | 
						        qDebug("FileInput::openFileStream: CRC32 OK for header: %s", qPrintable(crcHex));
 | 
				
			||||||
	        m_recordLengthMuSec = ((fileSize - sizeof(FileRecord::Header)) * 1000000UL) / ((m_sampleSize == 24 ? 8 : 4) * m_sampleRate);
 | 
						        m_recordLengthMuSec = ((fileSize - m_dataStartPos) * 1000000UL) / ((m_sampleSize == 24 ? 8 : 4) * m_sampleRate);
 | 
				
			||||||
	    }
 | 
						    }
 | 
				
			||||||
	    else if (!crcOK)
 | 
						    else if (!crcOK)
 | 
				
			||||||
	    {
 | 
						    {
 | 
				
			||||||
@ -260,12 +262,12 @@ void FileInput::seekFileStream(int seekMillis)
 | 
				
			|||||||
        quint64 seekPoint = ((m_recordLengthMuSec * seekMillis) / 1000) * m_sampleRate;
 | 
					        quint64 seekPoint = ((m_recordLengthMuSec * seekMillis) / 1000) * m_sampleRate;
 | 
				
			||||||
        seekPoint /= 1000000UL;
 | 
					        seekPoint /= 1000000UL;
 | 
				
			||||||
		m_fileInputWorker->setSamplesCount(seekPoint);
 | 
							m_fileInputWorker->setSamplesCount(seekPoint);
 | 
				
			||||||
        seekPoint *= (m_sampleSize == 24 ? 8 : 4); // + sizeof(FileRecord::Header)
 | 
					        seekPoint *= (m_sampleSize == 24 ? 8 : 4);
 | 
				
			||||||
#ifdef ANDROID
 | 
					#ifdef ANDROID
 | 
				
			||||||
        m_inputFile.seek(seekPoint + sizeof(FileRecord::Header));
 | 
					        m_inputFile.seek(seekPoint + m_dataStartPos);
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
		m_ifstream.clear();
 | 
							m_ifstream.clear();
 | 
				
			||||||
		m_ifstream.seekg(seekPoint + sizeof(FileRecord::Header), std::ios::beg);
 | 
							m_ifstream.seekg(seekPoint + m_dataStartPos, std::ios::beg);
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -350,6 +350,7 @@ public:
 | 
				
			|||||||
	int m_sampleRate;
 | 
						int m_sampleRate;
 | 
				
			||||||
	quint32 m_sampleSize;
 | 
						quint32 m_sampleSize;
 | 
				
			||||||
	quint64 m_centerFrequency;
 | 
						quint64 m_centerFrequency;
 | 
				
			||||||
 | 
						qint64 m_dataStartPos;       //!< Position of IQ data in file
 | 
				
			||||||
    quint64 m_recordLengthMuSec; //!< record length in microseconds computed from file size
 | 
					    quint64 m_recordLengthMuSec; //!< record length in microseconds computed from file size
 | 
				
			||||||
    quint64 m_startingTimeStamp;
 | 
					    quint64 m_startingTimeStamp;
 | 
				
			||||||
	QTimer m_masterTimer;
 | 
						QTimer m_masterTimer;
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user