6

This bug is already confirmed on epic games side, however, is there any fast fix for it for anyone who already faced the same issue? its only happen when the app load for 2nd time. I've debugged it using android studio, and found the AudioRecord() start error -38 is triggered when the app start for 2nd time.

Here is the link of the bug UE-62389

Here is my .h

    // Fill out your copyright notice in the Description page of Project Settings.    
 #pragma once     
 #include "CoreMinimal.h"
 #include "Components/ActorComponent.h"

 #include "Runtime/Online/Voice/Public/VoiceModule.h"
 #include "VolumeCapture.generated.h"


 UCLASS( ClassGroup=(Custom), meta=(BlueprintSpawnableComponent) )
 class MYPROJECT2_API UVolumeCapture : public UActorComponent
 {
     GENERATED_BODY()

 public:    
     // Sets default values for this component's properties
     UVolumeCapture();

 protected:
     // Called when the game starts
     virtual void BeginPlay() override;

 public:    
     // Called every frame
     virtual void TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction) override;
     TSharedPtr<IVoiceCapture> VoiceCapture_V;    
     uint32 VoiceCaptureBytesAvailable;
     TArray<uint8> VoiceCaptureBuffer;
     UPROPERTY(EditAnywhere, BlueprintReadWrite)
         float VoiceCaptureVolume;
 };

And here is my .cpp , I also added too much debugging at the end to be sure which capturing state , and its always ok when the app start for 2nd time.

 // Fill out your copyright notice in the Description page of Project Settings.

 #include "VolumeCapture.h"
 #include "Platform.h"



 // Sets default values for this component's properties
 UVolumeCapture::UVolumeCapture()
 {
     // Set this component to be initialized when the game starts, and to be ticked every frame.  You can turn these features
     // off to improve performance if you don't need them.
     PrimaryComponentTick.bCanEverTick = true;

     // ...
 }


 // Called when the game starts
 void UVolumeCapture::BeginPlay()
 {
     Super::BeginPlay();
     VoiceCapture_V = FVoiceModule::Get().CreateVoiceCapture();

     bool Success = VoiceCapture_V.IsValid(); //VoiceCapture->Start();
     if (Success)
     {
         VoiceCapture_V->Start();
         UE_LOG(LogTemp, Warning, TEXT("Voice capture started successfully"));
         GEngine->AddOnScreenDebugMessage(-1, 5.0f, FColor::Green, "Voice capture started successfully");
     }
     else
     {
         UE_LOG(LogTemp, Warning, TEXT("Voice capture not started successfully"));
         GEngine->AddOnScreenDebugMessage(-1, 5.0f, FColor::Red, "Voice capture starting failed");
     }
 }


 // Called every frame
 void UVolumeCapture::TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction)
 {
     Super::TickComponent(DeltaTime, TickType, ThisTickFunction);
     if (!VoiceCapture_V.IsValid())
     {
         UE_LOG(LogTemp, Warning, TEXT("Voice capture is not valid; skipping the rest of voice capture tick"));
         //GEngine->AddOnScreenDebugMessage(-1, 0.1f, FColor::Red, "Voice Capture is not valid");
         return;
     }
     else
     {
         //GEngine->AddOnScreenDebugMessage(-1, 0.1f, FColor::Green, "valid");
     }
     if (VoiceCapture_V->IsCapturing())
         GEngine->AddOnScreenDebugMessage(-1, 0.05f, FColor::Black, "Capturing data right now");
     else
         GEngine->AddOnScreenDebugMessage(-1, 0.05f, FColor::Black, "Not Capturing");



     EVoiceCaptureState::Type CaptureState = VoiceCapture_V->GetCaptureState(VoiceCaptureBytesAvailable);    

     UE_LOG(LogTemp, Warning, TEXT("Bytes available: %d\nCapture state: %s"), VoiceCaptureBytesAvailable, EVoiceCaptureState::ToString(CaptureState));

     FString NewString = FString::FromInt(VoiceCaptureBytesAvailable);
     GEngine->AddOnScreenDebugMessage(-1, 0.05f, FColor::Black, NewString);
     VoiceCaptureBuffer.Reset();

     if (CaptureState == EVoiceCaptureState::Ok && VoiceCaptureBytesAvailable > 0)
     {
         int16_t VoiceCaptureSample;
         uint32 VoiceCaptureReadBytes;
         float VoiceCaptureTotalSquared = 0;

         VoiceCaptureBuffer.SetNumUninitialized(VoiceCaptureBytesAvailable);

         VoiceCapture_V->GetVoiceData(VoiceCaptureBuffer.GetData(), VoiceCaptureBytesAvailable, VoiceCaptureReadBytes);

         for (int i = 0; i < VoiceCaptureBuffer.Num() / 2; i++)
         {
             VoiceCaptureSample = VoiceCaptureBuffer[i];  //(VoiceCaptureBuffer[i] << 8) | VoiceCaptureBuffer[i];
             VoiceCaptureTotalSquared += ((float)VoiceCaptureSample * (float)VoiceCaptureSample);
         }

         float VoiceCaptureMeanSquare = (2 * (VoiceCaptureTotalSquared / VoiceCaptureBuffer.Num()));
         float VoiceCaptureRms = FMath::Sqrt(VoiceCaptureMeanSquare);
         float VoiceCaptureFinalVolume = ((VoiceCaptureMeanSquare / 32768.0) * 20.f);

         VoiceCaptureVolume = VoiceCaptureFinalVolume;

         GEngine->AddOnScreenDebugMessage(-1, 0.05f, FColor::Blue, FString::Printf(TEXT("VoiceCaptureVolume: %f"), VoiceCaptureVolume));
     }

     if (CaptureState == EVoiceCaptureState::Error)
     {
         GEngine->AddOnScreenDebugMessage(-1, 2.0f, FColor::Emerald, "ERROR");
     }
     if (CaptureState == EVoiceCaptureState::NoData)
     {
         GEngine->AddOnScreenDebugMessage(-1, 0.05f, FColor::Emerald, "NoData");
     }
     if (CaptureState == EVoiceCaptureState::NotCapturing)
     {
         GEngine->AddOnScreenDebugMessage(-1, 1.0f, FColor::Emerald, "NotCapturing");
     }
     if (CaptureState == EVoiceCaptureState::UnInitialized)
     {
         GEngine->AddOnScreenDebugMessage(-1, 1.0f, FColor::Emerald, "UnInitialized");
     }
     if (CaptureState == EVoiceCaptureState::Stopping)
     {
         GEngine->AddOnScreenDebugMessage(-1, 1.0f, FColor::Emerald, "Stopping");
     }
     if (CaptureState == EVoiceCaptureState::BufferTooSmall)
     {
         GEngine->AddOnScreenDebugMessage(-1, 1.0f, FColor::Emerald, "BufferTooSmall");
     }
 }

Couldnt do more , any tips will be great.

thanks

EDIT : The AndroidVoiceModule is written using OpenSL ES , and it fail to shutdown the record driver correctly whenever I close the app. Even when I tried to close everything in order like - Clearing Buffer - Destroying recording object - Destroying Engine

Still didnt work.

VectorX
  • 657
  • 5
  • 12

0 Answers0