Имя: Пароль:
IT
 
Delphi + MP3
,
0 QarezZ
 
23.11.11
19:58
Итак, при запуске качается MP3 файлик из инета, затем проигрывается. После этого должно быть повторение, но файл не удаляется, пишет, что он занят мною! Как его освободить/удалить?
1 Лефмихалыч
 
23.11.11
20:11
А что связывает все три предложения между собой?
2 QarezZ
 
23.11.11
20:16
>А что связывает все три предложения между собой?
--
Скачивание - сохранение - проигрывание - (второе повторение цикла) - скачивание - не удается сохранить (перезаписать) или удалить.
3 Капитан Смоллет
 
23.11.11
20:19
4 QarezZ
 
23.11.11
20:20
5 Лефмихалыч
 
23.11.11
20:22
(2) потому, что ты файл не закрываешь.
юзай CloseFile() или чего там у вас в этих ваших обдолбаных дельфях
7 QarezZ
 
23.11.11
20:23
(2) потому, что ты файл не закрываешь.
юзай CloseFile() или чего там у вас в этих ваших обдолбаных дельфях
--
Нет переменной файла. Его BASS открывает.
8 Rie
 
23.11.11
20:25
(7) Открывать-то открывает... А закрывать кто будет?
9 andrewks
 
23.11.11
20:25
про дестрой объекта ещё не говорили?
10 QarezZ
 
23.11.11
20:25
(7) Открывать-то открывает... А закрывать кто будет?
--
как?
11 QarezZ
 
23.11.11
20:26
про дестрой объекта ещё не говорили?
--
а потом заново создавать? и как отвечать на пост?
12 Лефмихалыч
 
23.11.11
20:26
(7) я в душе ниипу, кто этот BASS, но я ставлю дайм, что он умеет не только открывать файлы, но  закрывать их.
И заказнчивай оверквотить - номера постав в скобках вполне достаточно для того, чтобы понять, на что ты отвечаешь
13 Rie
 
23.11.11
20:26
(10) Ты код свой покажи. А то кто ж его знает, что ты там делаешь.
14 Лефмихалыч
 
23.11.11
20:27
(11) отвечать на пост очень просто: (НомерПоста) _ТУТ_ТЕКСТ_ОТВЕТА_
15 QarezZ
 
23.11.11
20:28
(13)
ПЛИЗ НЕ СМЕЙТЕСЬ!
procedure TForm1.Button1Click(Sender: TObject);
var
 LoadStream: TMemoryStream;
 i: boolean;
 a, b: integer;
 o: string;
 Flags: TReplaceFlags;
begin
 CreateDir('cache');
 randomize;
 b := random(1000000);
 o := StringReplace(Application.Exename, 'read.exe', '', Flags);
 LoadStream := TMemoryStream.Create;
 IdHTTP1.Get('ссылка', LoadStream);
 IdHTTP1.Disconnect;
 LoadStream.SaveToFile('cache\' + IntToStr(b) + '.mp3');
 BASS_PlaySoundFile('cache\' + IntToStr(b) + '.mp3');
 LoadStream.Free;
 DeleteFile(o + 'cache\' + IntToStr(b) + '.mp3'); //вот тут нифига
end;
16 andrewks
 
23.11.11
20:32
а если строчку с BASS закомментить - даёт удалить?
17 QarezZ
 
23.11.11
20:34
(16) Да!
18 Rie
 
23.11.11
20:34
(15) Попробуй вместо BASS_PlaySoundFile использовать BASS_StreamCreateFile и BASS_ChannelPlay, а в конце - сказать BASS_ChannelStop
19 QarezZ
 
23.11.11
20:35
(18) сек, попробую
20 QarezZ
 
23.11.11
20:36
(18) ого там параметров! что в них надо писать?
21 Rie
 
23.11.11
20:36
(19) А если не получится - почитай документацию по BASS :-)
22 Rie
 
23.11.11
20:36
(20) см. (21)
23 Rie
 
23.11.11
20:36
+(18) И в конце BASS_StreamFree
24 andrewks
 
23.11.11
20:36
(17)а что в  BASS_PlaySoundFile()?
25 Лефмихалыч
 
23.11.11
20:37
(15) читай мануал к инструменту ПЕРЕД использованием
http://www.un4seen.com/doc/bass/BASS_StreamFree.html

вот из за таких школьников, дельфистов и зовут "Помогите найти компонент"
26 Лефмихалыч
 
23.11.11
20:37
виноват... без вброса не получилось...
27 Rie
 
23.11.11
20:37
(24) А там и есть те вызовы, которые в (18) :-)
28 QarezZ
 
23.11.11
20:37
(24) Играет он кагбэ
29 andrewks
 
23.11.11
20:38
(28) ты не мудри, ты код кажи
30 QarezZ
 
23.11.11
20:38
(25) Никогда не просил найти компонент)
31 QarezZ
 
23.11.11
20:38
(29) function TForm1.BASS_PlaySoundFile(const FileName: string): Boolean;
var
 ChannelInfo: BASS_CHANNELINFO;
begin
 Result:= False;
 Channel:= BASS_StreamCreateFile(False, PChar(FileName), 0, 0, 0);
 if (Channel <> 0) then
 ChannelType:= ctStream;
 if (Channel <> 0) then
 begin
   BASS_ChannelPlay(Channel, False);
 end;
 Result:= Channel <> 0;
end;
32 Rie
 
23.11.11
20:38
(28) Нет, он не "кагбэ играет". Он вызывает более другие функции, в которых самый прикол и есть.
33 Лефмихалыч
 
23.11.11
20:39
(30) просить почитать за тебя мануал, ИМХО, - еще срамнее
34 Rie
 
23.11.11
20:40
(33) Однако цели товарисч добился - мануал ему таки сюда запостили.
А что нехорошими словами шутили - так "плюнь в глаза - а ему божья роса".
35 QarezZ
 
23.11.11
20:41
Лан, ок, последний вопрос. Как делать ChannelStop уже когда все проигралось?
36 Rie
 
23.11.11
20:42
(35) Иди читай мануал.
37 QarezZ
 
23.11.11
20:43
(36) не нашел
38 Лефмихалыч
 
23.11.11
20:44
(35) в мануале этот вопрос освещен.
Вызывай BASS_ChannelStop и передавай ему дескриптор канала, полученный от BASS_StreamCreateFile.
(37) иди менять профессию тогда
39 andrewks
 
23.11.11
20:44
если тебе в итоге файл на диске не нужен, проигрывай его вообще из памяти, не мусори на диске
40 QarezZ
 
23.11.11
20:46
Всем спс разобрался. Сделал так:
repeat
   BASS.BASS_ChannelStop(Channel);
   BASS.BASS_StreamFree(Channel);
 until BASS_StreamGetFilePosition(Channel, BASS_FILEPOS_END) <> BASS_StreamGetFilePosition(Channel, BASS_FILEPOS_CURRENT);
41 Rie
 
23.11.11
20:48
(40) А это точно надо сначала канал уничтожить - а потом смотреть его позицию?
42 andrewks
 
23.11.11
20:48
sleep надо юзать
43 QarezZ
 
23.11.11
20:48
(41) фак, а как иначе?
44 QarezZ
 
23.11.11
20:48
(41) то есть как нормально
45 Лефмихалыч
 
23.11.11
20:51
(44) приди в сознание уже. Сам-то как думаешь?
46 Rie
 
23.11.11
20:52
(44) Твой цикл на первом же шаге перестанет его играть и прикончит. А только потом задумается - а надо ли это было делать?
Насчёт кошерности обращения к освобождённому ресурсу - я уж молчу.
47 QarezZ
 
23.11.11
20:52
Все, готово.. Ну спс однако всем.
52 pectopatop
 
23.11.11
21:06
Хотя после фраз типа "Где это в мануале?" хочется закрыть нах страничку
Проблемы невозможно решaть нa том же уровне компетентности, нa котором они возникaют. Альберт Эйнштейн