Перейти к содержанию
Fire Monkey от А до Я
  • 0

Как в Android из потока собрать wav файл?


Martifan

Вопрос

Доброго времени сутки 
у меня при вызове запроса сервер возвращает wav файл потоками, как мне собрать обратно из потоков wav файл? у меня аппликаце сделана на ОС Android 
на десктоп аппликаце все легко там пользуюсь Winapi.Mmsystem и все работает хорошо но Android не знает модуль Winapi.Mmsystem как можно решать эту проблему?
заранее спасибо 
 
 
Ссылка на комментарий

Рекомендуемые сообщения

  • 0
  • Администраторы

Согласно правилам нужен чистый тестовый проект, на котором вы это делаете. 

Хотя бы потому, что за фразой:

у меня при вызове запроса сервер возвращает wav файл потоками,

может скрываться куча реализаций и способов.

Ссылка на комментарий
  • 0

WaveAudio Package

пользуюсь этим компонентом 

http://www.delphiarea.com/products/delphi-packages/waveaudio/ вот ее ссылка 

 

код получение потока:

unit Main;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  Spin, StdCtrls, Buttons, mmSystem, WaveUtils, WaveStorage, WaveIO, WaveOut,
  WavePlayers, ComCtrls, ScktComp;

const
  WM_RECEIVERREADY = WM_USER;

type
  TMainForm = class(TForm)
    btnDisconnect: TButton;
    btnConnect: TButton;
    gbBroadcaster: TGroupBox;
    lblRemoteAddress: TLabel;
    lblRemotePort: TLabel;
    edRemoteAddress: TEdit;
    seRemotePort: TSpinEdit;
    edFormat: TEdit;
    lblFormat: TLabel;
    SaveDialog: TSaveDialog;
    lblFileSize: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure tcpClientConnect(Sender: TObject; Socket: TCustomWinSocket);
    procedure tcpClientDisconnect(Sender: TObject; Socket: TCustomWinSocket);
    procedure btnConnectClick(Sender: TObject);
    procedure btnDisconnectClick(Sender: TObject);
    procedure tcpClientRead(Sender: TObject; Socket: TCustomWinSocket);
  private
    tcpClient: TClientSocket;
    WaveFile: TWaveFile;
  end;

var
  MainForm: TMainForm;

implementation

{$R *.dfm}

uses
  WinSock;

{ Helper Functions }

function FormatSize(Size: Int64): String;
const
  KB = 1024;
  MB = 1024 * KB;
  GB = 1024 * MB;
begin
  if Size < KB then
    Result := FormatFloat('#,##0 Bytes', Size)
  else if Size < MB then
    Result := FormatFloat('#,##0.0 KB', Size / KB)
  else if Size < GB then
    Result := FormatFloat('#,##0.0 MB', Size / MB)
  else
    Result := FormatFloat('#,##0.0 GB', Size / GB);
end;

{ TMainForm }

procedure TMainForm.FormCreate(Sender: TObject);
begin
  tcpClient := TClientSocket.Create(Self);
  with tcpClient do
  begin
    ClientType := ctNonBlocking;
    OnConnect := tcpClientConnect;
    OnDisconnect := tcpClientDisconnect;
    OnRead := tcpClientRead;
  end;
end;

procedure TMainForm.FormDestroy(Sender: TObject);
begin
  tcpClient.Active := False;
end;

procedure TMainForm.tcpClientConnect(Sender: TObject; Socket: TCustomWinSocket);
begin
  btnDisconnect.Visible := True;
  btnConnect.Visible := False;
  edRemoteAddress.Enabled := False;
  seRemotePort.Enabled := False;
end;

procedure TMainForm.tcpClientDisconnect(Sender: TObject; Socket: TCustomWinSocket);
begin
  btnConnect.Visible := True;
  btnDisconnect.Visible := False;
  edRemoteAddress.Enabled := True;
  seRemotePort.Enabled := True;
  edFormat.Text := '';
  if Assigned(WaveFile) then
  begin
    WaveFile.EndRewrite;
    WaveFile.Free;
    WaveFile := nil;
    lblFileSize.Caption := '';
  end;
end;

procedure TMainForm.btnConnectClick(Sender: TObject);
begin
  if SaveDialog.Execute then
  begin
    WaveFile := TWaveFile.Create(SaveDialog.FileName, fmCreate or fmShareDenyWrite);
    tcpClient.Host := edRemoteAddress.Text;
    tcpClient.Port := seRemotePort.Value;
    tcpClient.Active := True;
  end;
end;

procedure TMainForm.btnDisconnectClick(Sender: TObject);
begin
  tcpClient.Active := False;
end;

procedure TMainForm.tcpClientRead(Sender: TObject; Socket: TCustomWinSocket);
var
  WaveFormat: PWaveFormatEx;
  WaveFormatSize: Integer;
  Data: Pointer;
  DataSize: Integer;
begin
  try
    if WaveFile.State = wssReady then // Getting Wave Format
    begin
      Socket.ReceiveBuf(WaveFormatSize, SizeOf(WaveFormatSize));
      GetMem(WaveFormat, WaveFormatSize);
      try
        Socket.ReceiveBuf(WaveFormat^, WaveFormatSize);
        edFormat.Text := GetWaveAudioFormat(WaveFormat);
        WaveFile.BeginRewrite(WaveFormat);
        Socket.SendText('READY');
        lblFileSize.Caption := 'Waiting for audio data...';
      finally
        FreeMem(WaveFormat);
      end;
    end
    else
    begin
      Sleep(0);
      DataSize := Socket.ReceiveLength;
      if DataSize > 0 then
      begin
        GetMem(Data, DataSize);
        try
          Socket.ReceiveBuf(Data^, DataSize);
          WaveFile.Write(Data^, DataSize);
          lblFileSize.Caption := 'Receiving: ' + FormatSize(WaveFile.Stream.Size);
        finally
          FreeMem(Data);
        end;
      end;
    end;
  except
    tcpClient.Active := False;
    Application.HandleException(Self);
  end;
end;

end.
Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...