mirror of
https://github.com/ddnet/ddnet.git
synced 2024-11-10 10:08:18 +00:00
Direct mix when recording audio now, and seems solve the stuck problem when
DDNet is not the focusing window
This commit is contained in:
parent
f2ffa996c2
commit
e910fe404f
|
@ -2522,6 +2522,7 @@ void CClient::Update()
|
||||||
if (IVideo::Current()->frameRendered())
|
if (IVideo::Current()->frameRendered())
|
||||||
{
|
{
|
||||||
IVideo::Current()->nextVideoFrame();
|
IVideo::Current()->nextVideoFrame();
|
||||||
|
IVideo::Current()->nextAudioFrame_timeline();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if(m_ButtonRender)
|
else if(m_ButtonRender)
|
||||||
|
@ -3356,10 +3357,7 @@ void CClient::StartVideo(IConsole::IResult *pResult, void *pUserData, const char
|
||||||
void CClient::Con_StopVideo(IConsole::IResult *pResult, void *pUserData)
|
void CClient::Con_StopVideo(IConsole::IResult *pResult, void *pUserData)
|
||||||
{
|
{
|
||||||
if (IVideo::Current())
|
if (IVideo::Current())
|
||||||
{
|
|
||||||
IVideo::Current()->stop();
|
IVideo::Current()->stop();
|
||||||
delete IVideo::Current();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -240,11 +240,6 @@ static void Mix(short *pFinalOut, unsigned Frames)
|
||||||
pInR += Step;
|
pInR += Step;
|
||||||
v->m_Tick++;
|
v->m_Tick++;
|
||||||
}
|
}
|
||||||
#if defined(CONF_VIDEORECORDER)
|
|
||||||
if(IVideo::Current())
|
|
||||||
if(m_LastBreak > IVideo::Current()->GetBreak())
|
|
||||||
v->m_Tick -= End;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// free voice if not used any more
|
// free voice if not used any more
|
||||||
if(v->m_Tick == v->m_pSample->m_NumFrames)
|
if(v->m_Tick == v->m_pSample->m_NumFrames)
|
||||||
|
@ -284,27 +279,16 @@ static void Mix(short *pFinalOut, unsigned Frames)
|
||||||
swap_endian(pFinalOut, sizeof(short), Frames * 2);
|
swap_endian(pFinalOut, sizeof(short), Frames * 2);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(CONF_VIDEORECORDER)
|
|
||||||
if (IVideo::Current())
|
|
||||||
{
|
|
||||||
if(m_LastBreak <= IVideo::Current()->GetBreak())
|
|
||||||
{
|
|
||||||
if(!IVideo::Current()->GetSync())
|
|
||||||
IVideo::Current()->nextAudioFrame(pFinalOut);
|
|
||||||
m_LastBreak += 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void SdlCallback(void *pUnused, Uint8 *pStream, int Len)
|
static void SdlCallback(void *pUnused, Uint8 *pStream, int Len)
|
||||||
{
|
{
|
||||||
(void)pUnused;
|
(void)pUnused;
|
||||||
Mix((short *)pStream, Len/2/2);
|
|
||||||
#if defined(CONF_VIDEORECORDER)
|
#if defined(CONF_VIDEORECORDER)
|
||||||
if (IVideo::Current())
|
if (!(IVideo::Current() && g_Config.m_ClVideoSndEnable))
|
||||||
memset(pStream, 0, Len);
|
Mix((short *)pStream, Len/2/2);
|
||||||
|
#else
|
||||||
|
Mix((short *)pStream, Len/2/2);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -373,6 +357,10 @@ int CSound::Update()
|
||||||
m_SoundVolume = WantedVolume;
|
m_SoundVolume = WantedVolume;
|
||||||
lock_unlock(m_SoundLock);
|
lock_unlock(m_SoundLock);
|
||||||
}
|
}
|
||||||
|
#if defined(CONF_VIDEORECORDER)
|
||||||
|
if(IVideo::Current() && g_Config.m_ClVideoSndEnable)
|
||||||
|
IVideo::Current()->nextAudioFrame(Mix);
|
||||||
|
#endif
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -182,12 +182,16 @@ void CVideo::stop()
|
||||||
|
|
||||||
if (m_pPixels)
|
if (m_pPixels)
|
||||||
free(m_pPixels);
|
free(m_pPixels);
|
||||||
|
|
||||||
|
if (ms_pCurrentVideo)
|
||||||
|
delete ms_pCurrentVideo;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CVideo::nextVideoFrame_thread()
|
void CVideo::nextVideoFrame_thread()
|
||||||
{
|
{
|
||||||
if (m_NextFrame)
|
if (m_NextFrame)
|
||||||
{
|
{
|
||||||
|
m_ProcessingVideoFrame = true;
|
||||||
// #ifdef CONF_PLATFORM_MACOSX
|
// #ifdef CONF_PLATFORM_MACOSX
|
||||||
// CAutoreleasePool AutoreleasePool;
|
// CAutoreleasePool AutoreleasePool;
|
||||||
// #endif
|
// #endif
|
||||||
|
@ -221,7 +225,6 @@ void CVideo::nextVideoFrame()
|
||||||
|
|
||||||
ms_Time += ms_TickTime;
|
ms_Time += ms_TickTime;
|
||||||
ms_LocalTime = (ms_Time-ms_LocalStartTime)/(float)time_freq();
|
ms_LocalTime = (ms_Time-ms_LocalStartTime)/(float)time_freq();
|
||||||
m_ProcessingVideoFrame = true;
|
|
||||||
m_NextFrame = true;
|
m_NextFrame = true;
|
||||||
m_vframe += 1;
|
m_vframe += 1;
|
||||||
|
|
||||||
|
@ -232,18 +235,26 @@ void CVideo::nextVideoFrame()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CVideo::nextAudioFrame(short* pData)
|
void CVideo::nextAudioFrame_timeline()
|
||||||
{
|
{
|
||||||
if (m_Recording && m_HasAudio)
|
if (m_Recording && m_HasAudio && !m_ProcessingAudioFrame)
|
||||||
{
|
{
|
||||||
|
if ((double)(m_vframe/m_FPS) >= m_AudioStream.enc->frame_number*m_AudioStream.enc->frame_size/m_AudioStream.enc->sample_rate)
|
||||||
|
{
|
||||||
|
m_NextaFrame = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void CVideo::nextAudioFrame(void (*Mix)(short *pFinalOut, unsigned Frames))
|
||||||
|
{
|
||||||
|
if (m_NextaFrame)
|
||||||
|
{
|
||||||
|
m_ProcessingAudioFrame = true;
|
||||||
//dbg_msg("video recorder", "video_frame: %lf", (double)(m_vframe/m_FPS));
|
//dbg_msg("video recorder", "video_frame: %lf", (double)(m_vframe/m_FPS));
|
||||||
//if((double)(m_vframe/m_FPS) < m_AudioStream.enc->frame_number*m_AudioStream.enc->frame_size/m_AudioStream.enc->sample_rate)
|
//if((double)(m_vframe/m_FPS) < m_AudioStream.enc->frame_number*m_AudioStream.enc->frame_size/m_AudioStream.enc->sample_rate)
|
||||||
//return;
|
//return;
|
||||||
m_aseq += 1;
|
Mix(m_aBuffer, ALEN);
|
||||||
mem_copy(m_aBuffer+(m_aseq%2)*1024, pData, sizeof(short)*1024);
|
|
||||||
if(!(m_aseq % 2) || m_aseq < 4) // jump first two audio frames
|
|
||||||
return;
|
|
||||||
m_ProcessingAudioFrame = true;
|
|
||||||
//m_AudioStream.frame->pts = m_AudioStream.enc->frame_number;
|
//m_AudioStream.frame->pts = m_AudioStream.enc->frame_number;
|
||||||
dbg_msg("video_recorder", "aframe: %d", m_AudioStream.enc->frame_number);
|
dbg_msg("video_recorder", "aframe: %d", m_AudioStream.enc->frame_number);
|
||||||
|
|
||||||
|
@ -308,6 +319,7 @@ void CVideo::nextAudioFrame(short* pData)
|
||||||
write_frame(&m_AudioStream);
|
write_frame(&m_AudioStream);
|
||||||
|
|
||||||
m_ProcessingAudioFrame = false;
|
m_ProcessingAudioFrame = false;
|
||||||
|
m_NextaFrame = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -32,6 +32,7 @@ extern "C"
|
||||||
|
|
||||||
#include <engine/shared/video.h>
|
#include <engine/shared/video.h>
|
||||||
#include <engine/shared/demo.h>
|
#include <engine/shared/demo.h>
|
||||||
|
#define ALEN 2048
|
||||||
|
|
||||||
|
|
||||||
// a wrapper around a single output AVStream
|
// a wrapper around a single output AVStream
|
||||||
|
@ -61,15 +62,16 @@ public:
|
||||||
|
|
||||||
virtual void nextVideoFrame();
|
virtual void nextVideoFrame();
|
||||||
virtual void nextVideoFrame_thread();
|
virtual void nextVideoFrame_thread();
|
||||||
virtual bool frameRendered() { return !m_NextFrame; };
|
virtual bool frameRendered() { return !m_NextFrame; }
|
||||||
|
|
||||||
virtual void nextAudioFrame(short* pData);
|
virtual void nextAudioFrame(void (*Mix)(short *pFinalOut, unsigned Frames));
|
||||||
|
virtual void nextAudioFrame_timeline();
|
||||||
|
|
||||||
static IVideo* Current() { return IVideo::ms_pCurrentVideo; }
|
static IVideo* Current() { return IVideo::ms_pCurrentVideo; }
|
||||||
|
|
||||||
static void Init() { av_log_set_level(AV_LOG_DEBUG); avcodec_register_all(); av_register_all(); }
|
static void Init() { av_log_set_level(AV_LOG_DEBUG); avcodec_register_all(); av_register_all(); }
|
||||||
|
|
||||||
bool GetSync() { if(m_Recording) return (double)(m_vframe/m_FPS) < m_AudioStream.enc->frame_number*m_AudioStream.enc->frame_size/m_AudioStream.enc->sample_rate; }
|
bool GetSync() { if(m_Recording) return (double)(m_vframe/m_FPS) <= m_AudioStream.enc->frame_number*m_AudioStream.enc->frame_size/m_AudioStream.enc->sample_rate; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void fill_video_frame();
|
void fill_video_frame();
|
||||||
|
@ -98,7 +100,7 @@ private:
|
||||||
//FILE *m_dbgfile;
|
//FILE *m_dbgfile;
|
||||||
int m_aseq;
|
int m_aseq;
|
||||||
int m_vseq;
|
int m_vseq;
|
||||||
short m_aBuffer[2048];
|
short m_aBuffer[ALEN];
|
||||||
int m_vframe;
|
int m_vframe;
|
||||||
|
|
||||||
int m_FPS;
|
int m_FPS;
|
||||||
|
@ -110,6 +112,7 @@ private:
|
||||||
bool m_ProcessingAudioFrame;
|
bool m_ProcessingAudioFrame;
|
||||||
|
|
||||||
bool m_NextFrame;
|
bool m_NextFrame;
|
||||||
|
bool m_NextaFrame;
|
||||||
|
|
||||||
bool m_HasAudio;
|
bool m_HasAudio;
|
||||||
|
|
||||||
|
|
|
@ -548,10 +548,7 @@ void CDemoPlayer::DoTick()
|
||||||
m_pConsole->Print(IConsole::OUTPUT_LEVEL_ADDINFO, "demo_player", "end of file");
|
m_pConsole->Print(IConsole::OUTPUT_LEVEL_ADDINFO, "demo_player", "end of file");
|
||||||
#if defined(CONF_VIDEORECORDER)
|
#if defined(CONF_VIDEORECORDER)
|
||||||
if (IVideo::Current())
|
if (IVideo::Current())
|
||||||
{
|
Stop();
|
||||||
IVideo::Current()->stop();
|
|
||||||
delete IVideo::Current();
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
if(m_Info.m_PreviousTick == -1)
|
if(m_Info.m_PreviousTick == -1)
|
||||||
{
|
{
|
||||||
|
@ -975,10 +972,7 @@ int CDemoPlayer::Stop()
|
||||||
{
|
{
|
||||||
#if defined(CONF_VIDEORECORDER)
|
#if defined(CONF_VIDEORECORDER)
|
||||||
if (IVideo::Current())
|
if (IVideo::Current())
|
||||||
{
|
|
||||||
IVideo::Current()->stop();
|
IVideo::Current()->stop();
|
||||||
delete IVideo::Current();
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if(!m_File)
|
if(!m_File)
|
||||||
|
|
|
@ -15,7 +15,8 @@ public:
|
||||||
virtual bool frameRendered() = 0;
|
virtual bool frameRendered() = 0;
|
||||||
virtual void nextVideoFrame_thread() = 0;
|
virtual void nextVideoFrame_thread() = 0;
|
||||||
|
|
||||||
virtual void nextAudioFrame(short* pData) = 0;
|
virtual void nextAudioFrame(void (*Mix)(short *pFinalOut, unsigned Frames)) = 0;
|
||||||
|
virtual void nextAudioFrame_timeline() = 0;
|
||||||
virtual bool GetSync() = 0;
|
virtual bool GetSync() = 0;
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue