@@ -336,93 +336,71 @@ LUA_FUNCTION_STATIC(IGModAudioChannel_Restart)
336336
337337
338338
339- class BassEncoderCallback : public IGModEncoderCallback , public GarrysMod ::Lua::ILuaThreadedCall
339+ class BassEncoderCallback : public IGModEncoderCallback
340340{
341341public:
342- BassEncoderCallback (int nReference )
342+ BassEncoderCallback (GarrysMod::Lua::ILuaInterface* pLua )
343343 {
344- m_nCallbackReference = nReference;
344+ m_pLua = pLua;
345+ m_nCallbackReference = Util::ReferenceCreate (pLua, " BassEncoderCallback - callback reference" );
345346 }
346347
347348 virtual ~BassEncoderCallback () {
348- if (m_nCallbackReference != -1 )
349+ if (m_pLua && m_nCallbackReference != -1 )
349350 {
350351 Msg (" BassEncoderCallback deleted while still holding a reference!\n " );
352+ Util::ReferenceFree (m_pLua, m_nCallbackReference, " BassEncoderCallback - callback leftover deletion" );
351353 m_nCallbackReference = -1 ;
354+ m_pLua = NULL ;
352355 }
353356 };
354357
355358 virtual bool ShouldForceFinish (IGModAudioChannelEncoder* pEncoder, void * nSignalData)
356359 {
357- // if (m_pLua == nSignalData)
358- // return true; // Force finish as this is our signal that our interface is shutting down!
360+ if (m_pLua == nSignalData)
361+ return true ; // Force finish as this is our signal that our interface is shutting down!
359362
360363 return false ;
361364 };
362365
363366 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)
377367 {
378368 if (m_nCallbackReference == -1 )
379369 return ;
380370
381- Util::ReferencePush (LUA , m_nCallbackReference);
382- if (m_nBassStatus == GModEncoderStatus::FINISHED) {
383- LUA ->PushBool (true );
384- LUA ->PushNil ();
371+ Util::ReferencePush (m_pLua , m_nCallbackReference);
372+ if (nStatus == GModEncoderStatus::FINISHED) {
373+ m_pLua ->PushBool (true );
374+ m_pLua ->PushNil ();
385375 } else {
386- LUA ->PushBool (false );
387- LUA ->PushString (" Encoder was interrupted by Lua shutdown!" );
376+ m_pLua ->PushBool (false );
377+ m_pLua ->PushString (" Encoder was interrupted by Lua shutdown!" );
388378 }
389- LUA->CallFunctionProtected (2 , 0 , true );
390-
391- Util::ReferenceFree (LUA, m_nCallbackReference, " BassEncoderCallback - callback deletion OnFinish" );
392- m_nCallbackReference = -1 ;
393- }
379+ m_pLua->CallFunctionProtected (2 , 0 , true );
394380
395- void OnShutdown ()
396- {
381+ Util::ReferenceFree (m_pLua, m_nCallbackReference, " BassEncoderCallback - callback deletion OnFinish" );
397382 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 ;
383+ m_pLua = NULL ;
406384 }
407385
408386private:
409- bool m_bIsBassDone = false ;
410- bool m_bForceDelete = false ;
387+ GarrysMod::Lua::ILuaInterface* m_pLua = nullptr ;
411388 int m_nCallbackReference = -1 ;
412- int m_nBassStatus = GModEncoderStatus::DIED;
413389};
414390
415- #if ENABLE_UTTERLY_BROKEN_ENCODER_SHIT // https://github.com/RaphaelIT7/gmod-holylib/commit/48bc854f48aa26ec6539eabd01b66d87110b4598#diff-82711262b6e5109632243c62ed0ab8cba506cdf021817af4af807da268297bce
416391LUA_FUNCTION_STATIC (IGModAudioChannel_EncodeToDisk)
417392{
418393 IGModAudioChannel* channel = Get_IGModAudioChannel (LUA, 1 , true );
419394
420395 const char * pFileName = LUA->CheckString (2 );
396+ // NOTE: Next time ensure I fucking use CheckNumber and not CheckString to then cast :sob: only took 8+ hours to figure out
421397 unsigned long nFlags = (unsigned long )LUA->CheckNumber (3 );
422398 LUA->CheckType (4 , GarrysMod::Lua::Type::Function);
399+ bool bAsync = LUA->GetBool (5 );
423400
424401 LUA->Push (4 );
425- BassEncoderCallback* pCallback = new BassEncoderCallback (LUA); // We do not manage this pointer! GModAudio does for us
402+ BassEncoderCallback* pCallback = new BassEncoderCallback (LUA);
403+ // We do not manage this pointer! GModAudio does for us
426404
427405 const char * pErrorMsg;
428406 IGModAudioChannelEncoder* pEncoder = channel->CreateEncoder (pFileName, nFlags, pCallback, &pErrorMsg);
@@ -433,7 +411,6 @@ LUA_FUNCTION_STATIC(IGModAudioChannel_EncodeToDisk)
433411 return 2 ;
434412 }
435413
436- bool bAsync = LUA->GetBool (5 );
437414 pEncoder->ProcessNow (bAsync);
438415 if (pEncoder->GetLastError (&pErrorMsg))
439416 {
@@ -446,7 +423,6 @@ LUA_FUNCTION_STATIC(IGModAudioChannel_EncodeToDisk)
446423 LUA->PushNil ();
447424 return 2 ;
448425}
449- #endif
450426
451427LUA_FUNCTION_STATIC (IGModAudioChannel_Update)
452428{
@@ -488,36 +464,6 @@ LUA_FUNCTION_STATIC(IGModAudioChannel_DestroyLink)
488464 return 2 ;
489465}
490466
491- LUA_FUNCTION_STATIC (IGModAudioChannel_EncodeToDisk)
492- {
493- IGModAudioChannel* channel = Get_IGModAudioChannel (LUA, 1 , true );
494-
495- const char * pFileName = LUA->CheckString (2 );
496- unsigned long nFlags = (unsigned long )LUA->CheckNumber (3 );
497-
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*/ );
506- if (!pErrorMsg)
507- { // Success
508- LUA->PushBool (true );
509- LUA->PushNil ();
510- return 2 ;
511- }
512-
513- // if (pCallback)
514- // LUA->AddThreadedCall(pCallback);
515-
516- LUA->PushBool (false );
517- LUA->PushString (pErrorMsg);
518- return 2 ;
519- }
520-
521467LUA_FUNCTION_STATIC (IGModAudioChannel_MakeServer)
522468{
523469 IGModAudioChannel* channel = Get_IGModAudioChannel (LUA, 1 , true );
@@ -527,8 +473,14 @@ LUA_FUNCTION_STATIC(IGModAudioChannel_MakeServer)
527473 unsigned long nBurst = (unsigned long )LUA->CheckString (4 );
528474 unsigned long nFlags = (unsigned long )LUA->CheckString (5 );
529475
530- LUA->PushBool (channel->MakeServer (strPort, nBuffer, nBurst, nFlags));
531- return 1 ;
476+ const char * pErrorCode = nullptr ;
477+ LUA->PushBool (channel->MakeServer (strPort, nBuffer, nBurst, nFlags, &pErrorCode));
478+ if (pErrorCode) {
479+ LUA->PushString (pErrorCode);
480+ } else {
481+ LUA->PushNil ();
482+ }
483+ return 2 ;
532484}
533485
534486LUA_FUNCTION_STATIC (bass_PlayFile)
@@ -710,9 +662,7 @@ void CBassModule::LuaShutdown(GarrysMod::Lua::ILuaInterface* pLua)
710662{
711663 // Finish all callbacks
712664 // We pass pLua so that our BassEncoderCallback can check if its their state and force a finish
713- #if ENABLE_UTTERLY_BROKEN_ENCODER_SHIT
714665 gGModAudio ->FinishAllAsync (pLua);
715- #endif
716666
717667 Util::NukeTable (pLua, " bass" );
718668}
0 commit comments