|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Вылетает ошибка при повторной проверке аудио файла компонентом NewAC
Доброе время суток форумчане,
Для воспроизведения звука использую компонент NewAC. Т.к. я записываю аудио файл в БД, то перед этим, я его проверяю: Код:
if OpenDialog1.Execute then begin MP3In1.FileName := OpenDialog1.FileName; //step 1 if not MP3In1.Valid then begin showmessage(C_audio_not_valid); Exit; end; MP3In1.Free; И вот когда я записываю файл первый раз в БД, - все нормально. Но последующие разы, программа выкидывает ошибку: Debugger Exception Notification Project PEng_gDB.exe raised exception class EAccessViolation with message 'Access violation at address 00538514 in module 'PEng_gDB.exe'. Read of address 00000000'. Process stopped. Use Step or Run to continue. Перед ошибкой, компилятор проходит «step 1», и выкидывает в файл («unit ACS_Classes») модуля компонента, на строку «step 2»: Код:
procedure TAuFileIn.SetFileName; begin CloseFile; //step 2 // StartSample := 0; // EndSample := -1; FWideFileName := FN; FFileName := FN; end; такое впечатление, как будто, я забыл что-то закрыть. Программа пример «MP3Player» (самого компонента), отрабатывает все на ура. Да и моя программа воспроизводит все файлы подряд. А вот когда я проверяю файл (без воспроизведения) – летит ошибка. Может кто-нибудь здесь подскажет, в чем заковыка? Заранее спасибо. |
#2
|
||||
|
||||
Видимо вы благополучно грохаете ваш MP3In1, а потом пытаетесь к нему обратится, на что и получаете AV
Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
Этот пользователь сказал Спасибо Страдалецъ за это полезное сообщение: | ||
Konstantin-78 (27.04.2015)
|
#3
|
|||
|
|||
Цитата:
Да возможно вы и правы, но за кодом, приведенном в первом листинге, идет строка: Код:
TBlobField(ibdsService.FieldByName('SPEAK')).LoadFromFile(OpenDialog1.FileName); В которой, я загружаю файл в БД. И без "MP3In1.Free;", у меня на загрузке вылазит другая ошибка: "Cannot open file "D:\Prog\Eng_gdb\Sound\help.mp3". Процесс не может получить доступ к файлу, так как этот файл занят другим процессом.", Может можно как нибудь другим способом, освобождать файл (в "MP3In1.FileName := OpenDialog1.FileName;")? |
#4
|
|||
|
|||
Да вы были правы,
вместо Код:
MP3In1.Free; Код:
MP3In1.Reset; Спасибо. |
#5
|
|||
|
|||
Можно еще один вопрос,
вот, когда я воспроизвожу звук из базы: Код:
begin PrSpeak := TMemoryStream.Create; TBlobField(ibqEmpty.FieldByName('SPEAK')).SaveToStream(PrSpeak); PrSpeak.Seek(0, soFromBeginning); MP3In1.Stream := PrSpeak; DXAudioOut1.Run; end А потом пытыюсь записать проверенный файл в БД Код:
if OpenDialog1.Execute then begin MP3In1.FileName := OpenDialog1.FileName; if not MP3In1.Valid then begin showmessage(C_audio_not_valid); //step 3 Exit; end; MP3In1.Reset; Без предварительного воспроизведения, файл проходит проверку и записывается в БД Последний раз редактировалось Konstantin-78, 27.04.2015 в 15:35. |
#6
|
||||
|
||||
Видимо файл занят в этот момент проигрывателем, требуется что-то типа Close
Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
#7
|
|||
|
|||
Я тоже так думал,
но в момент выпадения ошибки, я файл могу физически с диска удалить. и ошибка выпадает на строке step 4 (модуля "libwma1;" компонента): Код:
function TAudioStream.Read; begin pcbRead^ := FStream.Read(pv^, cb); //step 4 if pcbRead^ <> 0 then Result := S_OK else Result := -1; end; Последний раз редактировалось Konstantin-78, 27.04.2015 в 17:39. |
#8
|
||||
|
||||
Попробуйте ещё тогда позицию мемпотока перед записью на ноль выставить, может во время воспроизведения она сбивается, а назад не возвращается, в смысле PrSpeak.Position:= 0
Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
#9
|
|||
|
|||
Цитата:
Вы хотели сказать перед проверкой (потому что до записи он и так не доходит), Код:
PrSpeak.Position:= 0; MP3In1.FileName := OpenDialog1.FileName; if not MP3In1.Valid then begin showmessage(C_audio_not_valid); Exit; end; всеравно "собака" ругается. Нее... это в компоненте, что-то не освобождается :-( Есть еще вариант, использовать два компонента "MP3In" (один для записи, другой для воспроизведения), но это как-то не правильно И вообще, после каждого воспроизведения: Код:
procedure TFMain.DXAudioOut1Done(Sender: TComponent); begin PrSpeak.Free; sbSpeak.Down := false; end; Последний раз редактировалось Konstantin-78, 27.04.2015 в 20:39. |
#10
|
||||
|
||||
Цитата:
Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
#11
|
|||
|
|||
Цитата:
Конечно работает, два разных компонента...:-) Но всеравно, некрасиво как-то. (2 одинаковых компонента, последовательно выполняют по сути одну и ту же простую работу) Последний раз редактировалось Konstantin-78, 27.04.2015 в 18:06. |
#12
|
|||
|
|||
Оказалось все гораздо проще (нужно только help внимательно читать :-))
"...To unassign this property set it to nil..." но это в принципе то, о чем писал Alegun После всего, нужно делать: Код:
MP3In1.Stream := nil; В примере по компоненту использовался для воспроизведения файл, та не учавствовал поток... А я делал: Код:
MP3In1.Stream.Free; Последний раз редактировалось Konstantin-78, 27.04.2015 в 21:00. |