@@ -334,58 +334,85 @@ LUA_FUNCTION_STATIC(IGModAudioChannel_Restart)
334334 return 0 ;
335335}
336336
337- class BassEncoderCallback : public IGModEncoderCallback
337+
338+
339+ class BassEncoderCallback : public IGModEncoderCallback , public GarrysMod ::Lua::ILuaThreadedCall
338340{
339341public:
340- BassEncoderCallback (GarrysMod::Lua::ILuaInterface* pLua )
342+ BassEncoderCallback (int nReference )
341343 {
342- m_pLua = pLua;
343- m_nCallbackReference = Util::ReferenceCreate (pLua, " BassEncoderCallback - callback reference" );
344+ m_nCallbackReference = nReference;
344345 }
345346
346347 virtual ~BassEncoderCallback () {
347- if (m_pLua && m_nCallbackReference != -1 )
348+ if (m_nCallbackReference != -1 )
348349 {
349- Util::ReferenceFree (m_pLua, m_nCallbackReference, " BassEncoderCallback - callback deletion " );
350+ Msg ( " BassEncoderCallback deleted while still holding a reference! \n " );
350351 m_nCallbackReference = -1 ;
351- m_pLua = NULL ;
352352 }
353353 };
354354
355- virtual bool ShouldFinish (IGModAudioChannelEncoder* pEncoder, void * nSignalData)
355+ virtual bool ShouldForceFinish (IGModAudioChannelEncoder* pEncoder, void * nSignalData)
356356 {
357- if (m_pLua == nSignalData)
358- return true ; // Force finish as this is our signal that our interface is shutting down!
357+ // if (m_pLua == nSignalData)
358+ // return true; // Force finish as this is our signal that our interface is shutting down!
359359
360360 return false ;
361361 };
362362
363363 virtual void OnFinish (IGModAudioChannelEncoder* pEncoder, GModEncoderStatus nStatus)
364+ {
365+ m_bIsBassDone = true ;
366+
367+ if (m_bForceDelete)
368+ delete this ; // We serve no purpose... Lua is gone :NOOOOO:
369+ };
370+
371+ bool IsDone ()
372+ {
373+ return m_bIsBassDone;
374+ }
375+
376+ void Done (GarrysMod::Lua::ILuaInterface* LUA)
364377 {
365378 if (m_nCallbackReference == -1 )
366379 return ;
367380
368- Util::ReferencePush (m_pLua, m_nCallbackReference);
369- if (nStatus == GModEncoderStatus::FINISHED)
370- {
371- m_pLua->PushBool (true );
372- m_pLua->PushNil ();
381+ Util::ReferencePush (LUA, m_nCallbackReference);
382+ if (m_nBassStatus == GModEncoderStatus::FINISHED) {
383+ LUA->PushBool (true );
384+ LUA->PushNil ();
373385 } else {
374- m_pLua ->PushBool (false );
375- m_pLua ->PushString (" Encoder was interrupted by Lua shutdown!" );
386+ LUA ->PushBool (false );
387+ LUA ->PushString (" Encoder was interrupted by Lua shutdown!" );
376388 }
377- m_pLua ->CallFunctionProtected (2 , 0 , true );
389+ LUA ->CallFunctionProtected (2 , 0 , true );
378390
379- Util::ReferenceFree (m_pLua , m_nCallbackReference, " BassEncoderCallback - callback deletion OnFinish" );
391+ Util::ReferenceFree (LUA , m_nCallbackReference, " BassEncoderCallback - callback deletion OnFinish" );
380392 m_nCallbackReference = -1 ;
381- m_pLua = NULL ;
382- };
393+ }
394+
395+ void OnShutdown ()
396+ {
397+ m_nCallbackReference = -1 ;
398+ if (!m_bIsBassDone)
399+ {
400+ // Bass still uses us, so we gotta delay this
401+ m_bForceDelete = true ;
402+ return ;
403+ }
404+
405+ delete this ;
406+ }
383407
384408private:
385- GarrysMod::Lua::ILuaInterface* m_pLua = nullptr ;
409+ bool m_bIsBassDone = false ;
410+ bool m_bForceDelete = false ;
386411 int m_nCallbackReference = -1 ;
412+ int m_nBassStatus = GModEncoderStatus::DIED;
387413};
388414
415+ #if ENABLE_UTTERLY_BROKEN_ENCODER_SHIT // https://github.com/RaphaelIT7/gmod-holylib/commit/48bc854f48aa26ec6539eabd01b66d87110b4598#diff-82711262b6e5109632243c62ed0ab8cba506cdf021817af4af807da268297bce
389416LUA_FUNCTION_STATIC (IGModAudioChannel_EncodeToDisk)
390417{
391418 IGModAudioChannel* channel = Get_IGModAudioChannel (LUA, 1 , true );
@@ -419,6 +446,7 @@ LUA_FUNCTION_STATIC(IGModAudioChannel_EncodeToDisk)
419446 LUA->PushNil ();
420447 return 2 ;
421448}
449+ #endif
422450
423451LUA_FUNCTION_STATIC (IGModAudioChannel_Update)
424452{
@@ -460,23 +488,31 @@ LUA_FUNCTION_STATIC(IGModAudioChannel_DestroyLink)
460488 return 2 ;
461489}
462490
463- LUA_FUNCTION_STATIC (IGModAudioChannel_EncodeToDisk2 )
491+ LUA_FUNCTION_STATIC (IGModAudioChannel_EncodeToDisk )
464492{
465493 IGModAudioChannel* channel = Get_IGModAudioChannel (LUA, 1 , true );
466494
467495 const char * pFileName = LUA->CheckString (2 );
468496 unsigned long nFlags = (unsigned long )LUA->CheckString (3 );
469- LUA->CheckType (4 , GarrysMod::Lua::Type::Function);
470497
471- const char * pErrorMsg;
472- channel->EncodeToDisk2 (pFileName, nFlags, NULL , &pErrorMsg);
498+ /* BassEncoderCallback* pCallback = nullptr;
499+ if (LUA->IsType(4, GarrysMod::Lua::Type::Function))
500+ {
501+ LUA->Push(4);
502+ pCallback = new BassEncoderCallback(Util::ReferenceCreate(LUA, "BassEncoderCallback - callback reference"));
503+ }*/
504+
505+ const char * pErrorMsg = channel->EncodeToDisk (pFileName, nFlags/* , pCallback*/ );
473506 if (!pErrorMsg)
474507 { // Success
475508 LUA->PushBool (true );
476509 LUA->PushNil ();
477510 return 2 ;
478511 }
479512
513+ // if (pCallback)
514+ // LUA->AddThreadedCall(pCallback);
515+
480516 LUA->PushBool (false );
481517 LUA->PushString (pErrorMsg);
482518 return 2 ;
@@ -642,7 +678,6 @@ void CBassModule::LuaInit(GarrysMod::Lua::ILuaInterface* pLua, bool bServerInit)
642678
643679 // HolyLib specific
644680 Util::AddFunc (pLua, IGModAudioChannel_EncodeToDisk, " EncodeToDisk" );
645- Util::AddFunc (pLua, IGModAudioChannel_EncodeToDisk2, " EncodeToDisk2" );
646681 Util::AddFunc (pLua, IGModAudioChannel_Update, " Update" );
647682 Util::AddFunc (pLua, IGModAudioChannel_CreateLink, " CreateLink" );
648683 Util::AddFunc (pLua, IGModAudioChannel_DestroyLink, " DestroyLink" );
@@ -661,7 +696,9 @@ void CBassModule::LuaShutdown(GarrysMod::Lua::ILuaInterface* pLua)
661696{
662697 // Finish all callbacks
663698 // We pass pLua so that our BassEncoderCallback can check if its their state and force a finish
699+ #if ENABLE_UTTERLY_BROKEN_ENCODER_SHIT
664700 gGModAudio ->FinishAllAsync (pLua);
701+ #endif
665702
666703 Util::NukeTable (pLua, " bass" );
667704}
0 commit comments