@@ -336,95 +336,73 @@ 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 );
379+ m_pLua ->CallFunctionProtected (2 , 0 , true );
390380
391- Util::ReferenceFree (LUA , m_nCallbackReference, " BassEncoderCallback - callback deletion OnFinish" );
381+ Util::ReferenceFree (m_pLua , m_nCallbackReference, " BassEncoderCallback - callback deletion OnFinish" );
392382 m_nCallbackReference = -1 ;
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 ;
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
427- const char * pErrorMsg;
405+ const char * pErrorMsg = NULL ;
428406 IGModAudioChannelEncoder* pEncoder = channel->CreateEncoder (pFileName, nFlags, pCallback, &pErrorMsg);
429407 if (pErrorMsg)
430408 {
@@ -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,48 +464,36 @@ LUA_FUNCTION_STATIC(IGModAudioChannel_DestroyLink)
488464 return 2 ;
489465}
490466
491- LUA_FUNCTION_STATIC (IGModAudioChannel_EncodeToDisk )
467+ LUA_FUNCTION_STATIC (IGModAudioChannel_MakeServer )
492468{
493469 IGModAudioChannel* channel = Get_IGModAudioChannel (LUA, 1 , true );
494470
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 );
471+ const char * strPort = LUA->CheckString (2 );
472+ unsigned long nBuffer = (unsigned long )LUA->CheckNumber (3 );
473+ unsigned long nBurst = (unsigned long )LUA->CheckNumber (4 );
474+ unsigned long nFlags = (unsigned long )LUA->CheckNumber (5 );
475+
476+ const char * pErrorCode = nullptr ;
477+ LUA->PushBool (channel->MakeServer (strPort, nBuffer, nBurst, nFlags, &pErrorCode));
478+ if (pErrorCode) {
479+ LUA->PushString (pErrorCode);
480+ } else {
509481 LUA->PushNil ();
510- return 2 ;
511482 }
512-
513- // if (pCallback)
514- // LUA->AddThreadedCall(pCallback);
515-
516- LUA->PushBool (false );
517- LUA->PushString (pErrorMsg);
518483 return 2 ;
519484}
520485
521- LUA_FUNCTION_STATIC (IGModAudioChannel_MakeServer)
522- {
523- IGModAudioChannel* channel = Get_IGModAudioChannel (LUA, 1 , true );
524-
525- const char * strPort = LUA->CheckString (2 );
526- unsigned long nBuffer = (unsigned long )LUA->CheckString (3 );
527- unsigned long nBurst = (unsigned long )LUA->CheckString (4 );
528- unsigned long nFlags = (unsigned long )LUA->CheckString (5 );
486+ Push_LuaClass (IGModAudioChannelEncoder)
487+ Get_LuaClass(IGModAudioChannelEncoder, " IGModAudioChannelEncoder" )
529488
530- LUA->PushBool (channel->MakeServer (strPort, nBuffer, nBurst, nFlags));
531- return 1 ;
532- }
489+ Default__index(IGModAudioChannelEncoder);
490+ Default__newindex (IGModAudioChannelEncoder);
491+ Default__GetTable (IGModAudioChannelEncoder);
492+ Default__gc (IGModAudioChannelEncoder,
493+ IGModAudioChannelEncoder* channel = (IGModAudioChannelEncoder*)pStoredData;
494+ if (channel)
495+ delete channel;
496+ )
533497
534498LUA_FUNCTION_STATIC (bass_PlayFile)
535499{
@@ -644,6 +608,13 @@ void CBassModule::LuaInit(GarrysMod::Lua::ILuaInterface* pLua, bool bServerInit)
644608 if (bServerInit)
645609 return ;
646610
611+ Lua::GetLuaData (pLua)->RegisterMetaTable (Lua::IGModAudioChannelEncoder, pLua->CreateMetaTable (" IGModAudioChannelEncoder" ));
612+ Util::AddFunc (pLua, IGModAudioChannelEncoder__tostring, " __tostring" );
613+ Util::AddFunc (pLua, IGModAudioChannelEncoder__gc, " __gc" );
614+ Util::AddFunc (pLua, IGModAudioChannelEncoder__index, " __index" );
615+ Util::AddFunc (pLua, IGModAudioChannelEncoder__newindex, " __newindex" );
616+ pLua->Pop (1 );
617+
647618 Lua::GetLuaData (pLua)->RegisterMetaTable (Lua::IGModAudioChannel, pLua->CreateMetaTable (" IGModAudioChannel" ));
648619 Util::AddFunc (pLua, IGModAudioChannel__tostring, " __tostring" );
649620 Util::AddFunc (pLua, IGModAudioChannel__gc, " __gc" );
@@ -710,9 +681,7 @@ void CBassModule::LuaShutdown(GarrysMod::Lua::ILuaInterface* pLua)
710681{
711682 // Finish all callbacks
712683 // We pass pLua so that our BassEncoderCallback can check if its their state and force a finish
713- #if ENABLE_UTTERLY_BROKEN_ENCODER_SHIT
714684 gGModAudio ->FinishAllAsync (pLua);
715- #endif
716685
717686 Util::NukeTable (pLua, " bass" );
718687}
0 commit comments