PDA

View Full Version : تبدیل فرمت صدا



Kambiz
دوشنبه 17 آذر 1382, 01:20 صبح
تابع زیر جزوی از Wave Audio Package (http://delphiarea.com/products/waveaudio/) هست که بصورت رایگان عرضه میشه و قراره که یک فرمت صدا از نوع PCM رو به یک فرمت PCM دیگه تبدیل کنه:


// Converts the wave data to the specified format (PCM format only). The caller is
// responsible to release the memory allocated for the converted wave data.

function ConvertWaveFormat(const srcFormat: PWaveFormatEx; srcData: Pointer; srcDataSize: DWORD;
const dstFormat: PWaveFormatEx; out dstData: Pointer; out dstDataSize: DWORD): Boolean;
begin
Result := False;
if (srcFormat^.wFormatTag = WAVE_FORMAT_PCM) and
(dstFormat^.wFormatTag = WAVE_FORMAT_PCM) and
not CompareMem(srcFormat, dstFormat, SizeOf(TWaveFormatEx)) then
begin
dstDataSize := srcDataSize;
dstDataSize := MulDiv(dstDataSize, dstFormat^.nChannels, srcFormat^.nChannels);
dstDataSize := MulDiv(dstDataSize, dstFormat^.wBitsPerSample, srcFormat^.wBitsPerSample);
dstDataSize := MulDiv(dstDataSize, dstFormat^.nSamplesPerSec, srcFormat^.nSamplesPerSec);
GetMem(dstData, dstDataSize);

// ToDo

Result := True;
end;
end;
حدود دو ماه می‌شه که می‌خوام این تابع رو کامل کنم ولی اصلا" دستم به کار نمی‌ره. آخرش به این نتیجه رسیدم که از شما دوستان کمک بگیرم. کسی هست که حالش رو داشته باشه تا این تابع رو بنویسه؟

کد نوشته شده به نام شخص نویسنده در مستندات Package ثبت خواهد شد (یعنی کاری در جهت رضای خدا و خلق خدا). :)

ممنون. :oops:

Inprise
دوشنبه 17 آذر 1382, 10:36 صبح
برادر خجسته ،

یونیت ACM در مجموعهء Delphi-Jedi مشکل رو حل نمیکنه ؟ :roll: ( هر چند رسما" آنداکیومنتده لیکن با توجه به توصیفات موجود فکر میکنم برای شما کافی باشه .ضمنا" مطمئن نیستم اما فکر میکنم غیر از PCM از سایر رده ها مثل GSM هم حمایت میکنه )

Kambiz
دوشنبه 17 آذر 1382, 18:46 عصر
:D

ممنون برادر اینپرایز. یک راه میانبر عالی نشون دادی.

function ConvertWaveFormat(const srcFormat: PWaveFormatEx; srcData: Pointer; srcDataSize: DWORD;
const dstFormat: PWaveFormatEx; out dstData: Pointer; out dstDataSize: DWORD): Boolean;
var
StreamHandle: HACMSTREAM;
StreamHeader: ACMSTREAMHEADER;
begin
Result := False;
if acmStreamOpen(StreamHandle, nil, srcFormat^, dstFormat^, nil, 0, 0, ACM_STREAMOPENF_NONREALTIME) = 0 then
begin
try
FillChar(StreamHeader, SizeOf(StreamHeader), 0);
StreamHeader.cbStruct := SizeOf(StreamHeader);
StreamHeader.cbSrcLength := srcDataSize;
StreamHeader.pbSrc := srcData;
acmStreamSize(StreamHandle, srcDataSize, StreamHeader.cbDstLength, ACM_STREAMSIZEF_SOURCE);
ReallocMem(StreamHeader.pbDst, StreamHeader.cbDstLength);
try
if acmStreamPrepareHeader(StreamHandle, StreamHeader, 0) = 0 then
try
Result := (acmStreamConvert(StreamHandle, StreamHeader,
ACM_STREAMCONVERTF_START or ACM_STREAMCONVERTF_END) = 0);
finally
acmStreamUnprepareHeader(StreamHandle, StreamHeader, 0);
end;
finally
ReallocMem(StreamHeader.pbDst, StreamHeader.cbDstLengthUsed);
dstDataSize := StreamHeader.cbDstLengthUsed;
dstData := StreamHeader.pbDst;
end;
finally
acmStreamClose(StreamHandle, 0);
end;
end;
end;

Kambiz
دوشنبه 17 آذر 1382, 20:01 عصر
اینپرایز، ای مرد مرموز قرن، حداقل یک آدرس ایمیلی تو این سایت از خودت نشون بگذار. :lol:
این آدرست رو برام می‌فرستی تا تو Package بیارم؟ اگر اسم و رسم دیگه‌ای به غیر از اینپرایز هم داری و همچنین.
ممنون.

Inprise
سه شنبه 18 آذر 1382, 09:34 صبح
خیلی خوشحالم که رله شد . :)


یعنی کاری در جهت رضای خدا

وقتی آدم برای "رضای خدا" کار میکنه نباید اسم و رسمی از خودش بجا بگذاره ! مگه نه ؟ :mrgreen:

اینپرایز مؤمن و متعهد :evil2: