@@ -334,8 +334,6 @@ LUA_FUNCTION_STATIC(IGModAudioChannel_Restart)
334334 return 0 ;
335335}
336336
337-
338-
339337class BassEncoderCallback : public IGModEncoderCallback
340338{
341339public:
@@ -355,12 +353,8 @@ class BassEncoderCallback : public IGModEncoderCallback
355353 }
356354 };
357355
358- virtual bool ShouldForceFinish (IGModAudioChannelEncoder* pEncoder, void * nSignalData)
359- {
360- if (m_pLua == nSignalData)
361- return true ; // Force finish as this is our signal that our interface is shutting down!
362-
363- return false ;
356+ virtual bool ShouldForceFinish (IGModAudioChannelEncoder* pEncoder, void * nSignalData) {
357+ return m_pLua == nSignalData; // Force finish as this is our signal that our interface is shutting down!
364358 };
365359
366360 virtual void OnFinish (IGModAudioChannelEncoder* pEncoder, GModEncoderStatus nStatus)
@@ -388,7 +382,7 @@ class BassEncoderCallback : public IGModEncoderCallback
388382 int m_nCallbackReference = -1 ;
389383};
390384
391- LUA_FUNCTION_STATIC (IGModAudioChannel_EncodeToDisk )
385+ LUA_FUNCTION_STATIC (IGModAudioChannel_WriteToDisk )
392386{
393387 IGModAudioChannel* channel = Get_IGModAudioChannel (LUA, 1 , true );
394388
@@ -464,17 +458,42 @@ LUA_FUNCTION_STATIC(IGModAudioChannel_DestroyLink)
464458 return 2 ;
465459}
466460
467- LUA_FUNCTION_STATIC (IGModAudioChannel_MakeServer)
461+ PushReferenced_LuaClass (IGModAudioChannelEncoder)
462+ Get_LuaClass(IGModAudioChannelEncoder, " IGModAudioChannelEncoder" )
463+
464+ Default__index(IGModAudioChannelEncoder);
465+ Default__newindex (IGModAudioChannelEncoder);
466+ Default__GetTable (IGModAudioChannelEncoder);
467+ Default__gc (IGModAudioChannelEncoder,
468+ IGModAudioChannelEncoder* channel = (IGModAudioChannelEncoder*)pStoredData;
469+ if (channel)
470+ delete channel;
471+ )
472+
473+ LUA_FUNCTION_STATIC (IGModAudioChannelEncoder__tostring)
468474{
469- IGModAudioChannel* channel = Get_IGModAudioChannel (LUA, 1 , true );
475+ IGModAudioChannelEncoder* channel = Get_IGModAudioChannelEncoder (LUA, 1 , false );
476+ if (!channel)
477+ {
478+ LUA->PushString (" IGModAudioChannelEncoder [NULL]" );
479+ return 1 ;
480+ }
481+
482+ LUA->PushString (" IGModAudioChannelEncoder" );
483+ return 1 ;
484+ }
485+
486+ LUA_FUNCTION_STATIC (IGModAudioChannelEncoder_MakeServer)
487+ {
488+ IGModAudioChannelEncoder* encoder = Get_IGModAudioChannelEncoder (LUA, 1 , true );
470489
471490 const char * strPort = LUA->CheckString (2 );
472491 unsigned long nBuffer = (unsigned long )LUA->CheckNumber (3 );
473492 unsigned long nBurst = (unsigned long )LUA->CheckNumber (4 );
474493 unsigned long nFlags = (unsigned long )LUA->CheckNumber (5 );
475494
476495 const char * pErrorCode = nullptr ;
477- LUA->PushBool (channel ->MakeServer (strPort, nBuffer, nBurst, nFlags, &pErrorCode));
496+ LUA->PushBool (encoder ->MakeServer (strPort, nBuffer, nBurst, nFlags, &pErrorCode));
478497 if (pErrorCode) {
479498 LUA->PushString (pErrorCode);
480499 } else {
@@ -483,17 +502,51 @@ LUA_FUNCTION_STATIC(IGModAudioChannel_MakeServer)
483502 return 2 ;
484503}
485504
486- Push_LuaClass (IGModAudioChannelEncoder)
487- Get_LuaClass(IGModAudioChannelEncoder, " IGModAudioChannelEncoder" )
505+ class BassEncoderDeletionCallback : public IGModEncoderCallback
506+ {
507+ public:
508+ BassEncoderDeletionCallback (GarrysMod::Lua::ILuaInterface* pLua) {
509+ m_pLua = pLua;
510+ }
488511
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- )
512+ virtual bool ShouldForceFinish (IGModAudioChannelEncoder* pEncoder, void * nSignalData) {
513+ return m_pLua == nSignalData;
514+ };
515+
516+ virtual void OnFinish (IGModAudioChannelEncoder* pEncoder, GModEncoderStatus nStatus)
517+ {
518+ // The IGModAudioChannelEncoder deletes itself, so we gotta ensure no invalid pointers are left in Lua
519+ Delete_IGModAudioChannelEncoder (m_pLua, pEncoder);
520+ }
521+ private:
522+ GarrysMod::Lua::ILuaInterface* m_pLua;
523+ };
524+
525+ LUA_FUNCTION_STATIC (IGModAudioChannel_CreateEncoder)
526+ {
527+ IGModAudioChannel* channel = Get_IGModAudioChannel (LUA, 1 , true );
528+
529+ const char * pFileName = LUA->CheckString (2 );
530+ // NOTE: Next time ensure I fucking use CheckNumber and not CheckString to then cast :sob: only took 8+ hours to figure out
531+ unsigned long nFlags = (unsigned long )LUA->CheckNumber (3 );
532+
533+ LUA->Push (4 );
534+ BassEncoderDeletionCallback* pCallback = new BassEncoderDeletionCallback (LUA);
535+ // We do not manage this pointer! GModAudio does for us
536+
537+ const char * pErrorMsg = NULL ;
538+ IGModAudioChannelEncoder* pEncoder = channel->CreateEncoder (pFileName, nFlags, pCallback, &pErrorMsg);
539+ if (pErrorMsg)
540+ {
541+ LUA->PushBool (false );
542+ LUA->PushString (pErrorMsg);
543+ return 2 ;
544+ }
545+
546+ Push_IGModAudioChannelEncoder (LUA, pEncoder);
547+ LUA->PushNil ();
548+ return 2 ;
549+ }
497550
498551LUA_FUNCTION_STATIC (bass_PlayFile)
499552{
@@ -613,6 +666,7 @@ void CBassModule::LuaInit(GarrysMod::Lua::ILuaInterface* pLua, bool bServerInit)
613666 Util::AddFunc (pLua, IGModAudioChannelEncoder__gc, " __gc" );
614667 Util::AddFunc (pLua, IGModAudioChannelEncoder__index, " __index" );
615668 Util::AddFunc (pLua, IGModAudioChannelEncoder__newindex, " __newindex" );
669+ Util::AddFunc (pLua, IGModAudioChannelEncoder_MakeServer, " MakeServer" );
616670 pLua->Pop (1 );
617671
618672 Lua::GetLuaData (pLua)->RegisterMetaTable (Lua::IGModAudioChannel, pLua->CreateMetaTable (" IGModAudioChannel" ));
@@ -661,11 +715,11 @@ void CBassModule::LuaInit(GarrysMod::Lua::ILuaInterface* pLua, bool bServerInit)
661715 Util::AddFunc (pLua, IGModAudioChannel_NotImplemented, " Set3DEnabled" );
662716
663717 // HolyLib specific
664- Util::AddFunc (pLua, IGModAudioChannel_EncodeToDisk, " EncodeToDisk" );
718+ Util::AddFunc (pLua, IGModAudioChannel_WriteToDisk, " WriteToDisk" );
719+ Util::AddFunc (pLua, IGModAudioChannel_CreateEncoder, " CreateEncoder" );
665720 Util::AddFunc (pLua, IGModAudioChannel_Update, " Update" );
666721 Util::AddFunc (pLua, IGModAudioChannel_CreateLink, " CreateLink" );
667722 Util::AddFunc (pLua, IGModAudioChannel_DestroyLink, " DestroyLink" );
668- Util::AddFunc (pLua, IGModAudioChannel_MakeServer, " MakeServer" );
669723 pLua->Pop (1 );
670724
671725 Util::StartTable (pLua);
0 commit comments