作者: ackcheng 時間: 2008-11-12 11:42 標題: Freelance Linux programmer
Anyone know where I can find freelance Linux programmer?
作者: cuph 時間: 2008-11-12 13:44
請問想要寫咩language呢 ?
Linux programmer 都可以有好多野, shell, perl, php, C ?
作者: foobar 時間: 2008-11-12 15:46
其實我想八o下樓主係想搵人改 Linux Kernel 定有件 Hardware 想寫 Linux Driver? 不過我冇門路介紹
如果唔係要搞到咁專的話,其實 Open Source Software 入面好可能已經有類似你想要o既o野,橫掂你搵 Freelance 都諗住要洗錢,不如睇o下有冇現成類似 Project,Send 個 Email 問o下個作者幫你做個改動收幾錢仲好
作者: ackcheng 時間: 2008-11-12 18:47
Thanks. Actually I am using BruteFir as a player/convolver/digital crossover for music playback
http://www.ludd.luth.se/~torger/brutefir.html
However, each time I play a wav file, I have to type the file name as part of the shell script. I would like someone to help me to write a GUI so that it can load the whole CD into ram disk, and allow play back function like fast forward etc. Essentially, it is a GUI for running a shell script.
Should I look for someone who can write C++? Should not be too complicated.
作者: toylet 時間: 2008-11-12 20:27
提示: 作者被禁止或刪除 內容自動屏蔽
作者: ackcheng 時間: 2008-11-12 21:21
different quality ma!
作者: hdvd-rom 時間: 2008-11-13 22:24
can you give some tutorials, howto or documentation about this piece of software?
Since this software have not been updated for a long time. There are only few documents talking about the configuration and usage. An additional question is which desktop environment are you using?
作者: ackcheng 時間: 2008-11-13 22:34
This software allows digital signal processing which is what I required. The trick is to control the configuration file. with the shell script. In my origial script, I divided it into t1 t2 and t3. T1 and t3 are always the same, t2 is like this
device: "file" { path: "/music_ram/15_ArneDomnerus_AntiphoneBlues.wav"; skip: 44; };
This is the command needed to control the play back. When I play the music, I have another script which which combine t1, t2 and t3 into a single configuration file.
The problem I have now is that I have to type the file name every time and i would like it to be controlled by a good GUI.
作者: ackcheng 時間: 2008-11-13 22:35
At the moment, I am using it in SPBlinux but I plan to use it in Ubuntu studio
作者: hdvd-rom 時間: 2008-11-16 23:07
can you provide a set of usable configuration files, filters and sound files for testing purpose?
作者: hdvd-rom 時間: 2008-11-17 16:45
i have created a prototype using python + gtk+ which only include the most basic features.
it should be runnable on most gnome-based linux distributions.
will you give it a try?
features in this moment:
1.select multi-files for playing.
2.play & stop
3.previous, next button
4.repeat mode
5.WAV playback
other features can be add as demand
e.g.(playlist, configuration editor, other music format, shuffle mode....etc)
in order to use this prototype, you should set the input to stdin.
you can save it using text editor and give execute right to it, then you can use it as a normal binary program.
[ 本帖最後由 hdvd-rom 於 2008-11-17 16:54 編輯 ]
作者: ackcheng 時間: 2008-11-18 01:02
Wow, you are so quick, I was working on the config file.
How can I email you?
作者: ntony 時間: 2008-11-18 19:57
I'm interesting in helping. I will send you my email via PM.
作者: hdvd-rom 時間: 2008-11-19 11:07
just a prototype and i don't have time to do a complete version.
it is nice to have someone interested in linux programming, you will share the source code for study purpose?
here is my prototype.
comment is welcome, since i still very new to programming.
save the first code block as "player.py" and the second code block as "player.glade"
- #!/usr/bin/env python
- import sys
- #include gtk::python binding
- try:
- import pygtk
- #confirm the gtk version is 2.0 or above
- pygtk.require('2.0')
- except:
- pass
- try:
- #include gtk and glade library
- import gtk
- import gtk.glade
- except:
- sys.exit(1)
- import subprocess
- import os
- import threading
- status = "stop"
- class ProcessHolder(threading.Thread):
- def __init__(self,process):
- self.process = process
- threading.Thread.__init__(self)
- def run(self):
- print "process start"
- while self.process.returncode == None:
- continue
- print "before hell"
- print "status: " + status
- if status == "playing":
- self.player.playNext()
-
- class BrutefirPlayer:
- """The window object for tutorial"""
- def __init__(self):
- self.gladefile = "player.glade"
- self.currentFile = 0
- self.files = []
- #self.process = ""
- status = "stop"
- self.pholder = threading.Thread()
- self.lock = threading.RLock()
- #Load the glade file and contruct the whole GUI as glade described
- self.xml = gtk.glade.XML(self.gladefile)
- #self.xml = gtk.glade.xml_new_from_buffer(self.gladefile,len(self.gladefile))
- self.filechooser = self.xml.get_widget("filechooser")
- self.play_song = self.xml.get_widget("play")
- #match the handler function name and the event handler name
- # format = "the event name" : the handler function
- # e.g. 'on_' + button1(widget name) + '_' clicked(event)
- dic = { "on_play_clicked" : self.on_play_clicked,
- "on_prev_song_clicked" : self.on_prev_song_clicked,
- "on_next_song_clicked" : self.on_next_song_clicked,
- "on_openfile_clicked" : self.on_openfile_clicked,
- "on_file_ok_clicked" : self.on_file_ok_clicked,
- "on_file_cancel_clicked" : self.on_file_cancel_clicked,
- "gtk_main_quit" : gtk.main_quit }
- #connect all the handler and signal
- self.xml.signal_autoconnect(dic)
- def on_play_clicked(self, Widget):
- #example handler for button1 clicked event
- #the Widget is a user data being passed with the signal
- #it can be any widget in the structure
- if Widget.get_label() == gtk.STOCK_MEDIA_PLAY:
- self.playCurrentFile()
- Widget.set_label(gtk.STOCK_MEDIA_STOP)
- else:
- Widget.set_label(gtk.STOCK_MEDIA_PLAY)
- self.stopPlaying()
- def on_prev_song_clicked(self, Widget):
- if self.currentFile <= 0:
- self.currentFile = len(self.files)-1
- else:
- self.currentFile = self.currentFile - 1
- if self.play_song.get_label() == gtk.STOCK_MEDIA_STOP:
- self.playCurrentFile()
- def on_next_song_clicked(self, Widget):
- if self.currentFile >= len(self.files) - 1:
- self.currentFile = 0
- else:
- self.currentFile = self.currentFile + 1
- if self.play_song.get_label() == gtk.STOCK_MEDIA_STOP:
- self.playCurrentFile()
- def on_openfile_clicked(self, Widget):
- self.filechooser.show()
- def on_file_ok_clicked(self, Widget):
- self.setFile()
- self.filechooser.hide()
- def on_file_cancel_clicked(self,Widget):
- self.filechooser.hide()
- def setFile(self):
- self.files = self.filechooser.get_uris()
- print self.files
- self.currentFile = 0
-
- def playCurrentFile(self):
- self.stopPlaying()
- status = "playing"
- wav = open(self.files[self.currentFile][6:])
- self.process = subprocess.Popen("brutefir",stdin=wav)
- self.pholder = ProcessHolder(self.process)
- self.pholder.start()
- def playFile(self,id=0):
- self.currentFile=id%(len(self.files)-1)
- self.playCurrentFile()
- def stopPlaying(self):
- self.lock.acquire()
- status = "stop"
- subprocess.call(["killall","brutefir"])
- subprocess.call(["killall","brutefir.orig"])
- self.lock.release()
- while self.pholder.isAlive():
- print "alive"
- continue
- def askForNext(self):
- return (self.currentFile +1) % (len(self.files))
- def playNext(self):
- if status == "playing":
- print "play next song"
- id = self.askForNext()
- self.playFile(id)
- def gtk_main_quit( self ):
- #simple function connection
- gtk.main_quit()
- if __name__ == "__main__":
- #create a button window object
- g = BrutefirPlayer()
- #start the gtk mainloop
- gtk.main()
- <?xml version="1.0" encoding="UTF-8" standalone="no"?>
- <!DOCTYPE glade-interface SYSTEM "glade-2.0.dtd">
- <!--Generated with glade3 3.4.5 on Mon Nov 17 06:25:09 2008 -->
- <glade-interface>
- <widget class="GtkWindow" id="window1">
- <property name="visible">True</property>
- <property name="title" translatable="yes">BrutefirPlayer</property>
- <signal name="delete_event" handler="gtk_main_quit"/>
- <signal name="destroy_event" handler="gtk_main_quit"/>
- <child>
- <widget class="GtkHButtonBox" id="hbuttonbox1">
- <property name="visible">True</property>
- <child>
- <widget class="GtkButton" id="openfile">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="receives_default">True</property>
- <property name="label" translatable="yes">gtk-open</property>
- <property name="use_stock">True</property>
- <property name="response_id">0</property>
- <signal name="clicked" handler="on_openfile_clicked"/>
- </widget>
- </child>
- <child>
- <widget class="GtkButton" id="prev_song">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="receives_default">True</property>
- <property name="label" translatable="yes">gtk-media-previous</property>
- <property name="use_stock">True</property>
- <property name="response_id">0</property>
- <signal name="clicked" handler="on_prev_song_clicked"/>
- </widget>
- <packing>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
- <widget class="GtkButton" id="play">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="receives_default">True</property>
- <property name="label" translatable="yes">gtk-media-play</property>
- <property name="use_stock">True</property>
- <property name="response_id">0</property>
- <signal name="clicked" handler="on_play_clicked"/>
- </widget>
- <packing>
- <property name="position">2</property>
- </packing>
- </child>
- <child>
- <widget class="GtkButton" id="next_song">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="receives_default">True</property>
- <property name="label" translatable="yes">gtk-media-next</property>
- <property name="use_stock">True</property>
- <property name="response_id">0</property>
- <signal name="clicked" handler="on_next_song_clicked"/>
- </widget>
- <packing>
- <property name="position">3</property>
- </packing>
- </child>
- </widget>
- </child>
- </widget>
- <widget class="GtkFileChooserDialog" id="filechooser">
- <property name="border_width">5</property>
- <property name="title" translatable="yes">FileChooser</property>
- <property name="window_position">GTK_WIN_POS_CENTER_ON_PARENT</property>
- <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property>
- <property name="has_separator">False</property>
- <property name="select_multiple">True</property>
- <signal name="file_activated" handler="on_file_ok_clicked"/>
- <child internal-child="vbox">
- <widget class="GtkVBox" id="dialog-vbox1">
- <property name="visible">True</property>
- <property name="spacing">2</property>
- <child>
- <placeholder/>
- </child>
- <child internal-child="action_area">
- <widget class="GtkHButtonBox" id="dialog-action_area1">
- <property name="visible">True</property>
- <property name="layout_style">GTK_BUTTONBOX_END</property>
- <child>
- <widget class="GtkButton" id="file_ok">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="receives_default">True</property>
- <property name="label" translatable="yes">gtk-ok</property>
- <property name="use_stock">True</property>
- <property name="response_id">0</property>
- <signal name="clicked" handler="on_file_ok_clicked"/>
- </widget>
- </child>
- <child>
- <widget class="GtkButton" id="file_cancel">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="receives_default">True</property>
- <property name="label" translatable="yes">gtk-cancel</property>
- <property name="use_stock">True</property>
- <property name="response_id">0</property>
- <signal name="clicked" handler="on_file_cancel_clicked"/>
- </widget>
- <packing>
- <property name="position">1</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="expand">False</property>
- <property name="pack_type">GTK_PACK_END</property>
- </packing>
- </child>
- </widget>
- </child>
- </widget>
- <widget class="GtkWindow" id="playlist">
- <property name="title" translatable="yes">Play List</property>
- <child>
- <widget class="GtkTreeView" id="songtree">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <signal name="row_activated" handler="on_songtree_row_activated"/>
- </widget>
- </child>
- </widget>
- </glade-interface>
[ 本帖最後由 hdvd-rom 於 2008-11-20 15:57 編輯 ]
作者: ackcheng 時間: 2008-11-19 23:10
Dear HDVD-Rom,
Thanks for kicking off the program. Let me work through it and I will certainly post it up here.
Yours
ackcheng
作者: hdvd-rom 時間: 2008-11-20 15:55
pygtk main site have all you wanted, include reference, tutorials, download.
python have many free book available, like dive into python, how to think like a computer scientist....
python official site(reference, tutorials, download, books, howto, useful links)
http://www.python.org/
pygtk official site(reference, tutorials, download)
www.pygtk.org
dive into python(book,useful links)
http://diveintopython.org/
python cook recipes(cookbook)
http://code.activestate.com/recipes/langs/python/
learning python (tutorials)
www.learningpython.com
dicussion group(Q&A)
http://groups.google.com/group/comp.lang.python/topics
my program is only a rapid demo for showing the possibility and the included technologies.
Therefore, it has not much value for studying. it just like a combination of samples.
p.s. save the first code block as "player.py" and the second code block as "player.glade"
[ 本帖最後由 hdvd-rom 於 2008-11-20 15:58 編輯 ]
